LoginSignup
87
55

More than 5 years have passed since last update.

複数個前のコミットにさかのぼって履歴を書き換える

Last updated at Posted at 2013-06-11

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でやらねば、それが正しい歴史のはず…という思いから
このような小細工を試してみた。)

87
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
87
55