git rebase -iで過去のコミットを編集する

git rebase -iで過去を改竄する。

git rebase -i ブランチ名 で過去のコミットを編集することが出来ます。
細かいことはこちら古いコミットを書き換える: 歴史修正主義者のための git rebase -i 入門 - 学習する機械、学習しない人間 Next Generation

  1. git rebase -iして出てくる指示書に何をしたいのか書き、過去の変更が始まったらそれぞれのフェーズにあった変更を行います。
  2. 変更が終わったら必要ならgit addし、git commit --amendして変更をコミットします。
  3. git commit --amendすると変更内容のコミットと同時にcommitメッセージの変更を行えるので、適宜編集します。
  4. コミットしたらgit rebase --continueで次のコミットの編集に移動します。

途中で失敗した場合はgit rebase --abortで全てを無かった事にしてgit rebase -iを行う直前に戻れます。

リモートリポジトリの過去を改竄する。

複数ヶ所のPCから同じリモートリポジトリに対して作業を行なっている場合、リモートリポジトリを通してやりかけの作業を共有できると便利です。
ただしこの場合、リモートリポジトリのコミットログを変更できないとコミットログがグッチャグチャになってしまいます。
これもgit rebase -iで解決できます。

  1. git checkout -b ローカルのブランチ名 origin/リモートのブランチ名 でブランチを切ります。
  2. git rebase -iします。
  3. git push origin +ローカルのブランチ名:リモートのブランチ名 して強制的にコミットツリーを変更します。
  4. 他のリポジトリから変更を取得する際は、git fetchしてgit rebase origin/リモートのブランチ名 としましょう。

なお、rebase -iで行った編集が、「HEADから順にいくつかのコミットを削除した」だけだと、他のcloneしたリポジトリで変更後のリモートリポジトリの内容をfetchしてrebaseしても、直接pullしても反映されないので注意。