git 使うようになってまだ日が浅いけど、
初めてそこそこテクニカルなことをしたように感じたのでメモっておこう。
コミット3:piyoファイルを修正
コミット2:fugaファイルを修正
コミット1:hogeファイルを修正
こんな感じで三回に分けてコミットしていて、
さあmasterにプッシュするぞという直前に
hogeファイルに追加で修正しないといけないものがあったと気づいた。
普通にコミットして
コミット4:hogeファイルを修正(対応漏れ…)
コミット3:piyoファイルを修正
コミット2:fugaファイルを修正
コミット1:hogeファイルを修正
こういう履歴にしたくなくって、
本来はコミット1でやっておくべきだったのでこれに含めたい。
最後のコミットpiyoへの追加ならgit commit --amendで済むのだけど、
これはちょっと複雑そう。
こんなふうにやるとできる。
git rebase -i HEAD~3
を実行すると、エディタが開いてこう表示される。
pick <コミット1のhash> hogeファイルを修正
pick <コミット2のhash> fugaファイルを修正
pick <コミット3のhash> piyoファイルを修正
さかのぼりたいコミットのpickをeditに変更して保存する。
edit <コミット1のhash> hogeファイルを修正
pick <コミット2のhash> fugaファイルを修正
pick <コミット3のhash> piyoファイルを修正
ワーキングディレクトリがコミット1の状態に戻るので、
本来含めるべきだった修正を行う。
git add hoge
git commit --amend
でコミット1をやり直す。
その後、
git rebase --continue
を実行すると、新しいコミット1の後にコミット2と3が適用された状態になる。
歴史の書き換え完了!
(masterにプッシュ後はやっちゃいけないだろうし、
コミット2や3でもhogeファイルに対する変更がたくさん入っているとうまくいかないかもしれない。
今回は、hogeに対する修正はコミット1でやらねば、それが正しい歴史のはず…という思いから
このような小細工を試してみた。)