gitのコミットの歴史を改変する(git rebase) 2 / 2

git rebase パート1の続きです。

fixed(コメントは変更せずにコミットをまとめる)

fixedsquash と同じく1つ前のコミットとまとめる機能がありますが squash と違うのはコメントはそのままにするということです。

squash と同じ説明になりますが 70b3379メソッド名のタイポ修正 を何事もなかったかのようにしたい時は cce19c9 とまとめてしまいます。いつものように

1
[kengo@tkengo-mac] $ git rebase -i cce19c9~1

こうして

1
2
3
pick cce19c9 通信用のクラスの実装とテストの追加
fixed 70b3379 メソッド名のタイポ修正
pick aebf22c テストが落ちてたので修正

とします。すると squash の場合はこの後にコメントを入力する画面が出て来ましたが fixed の場合はそれが出ません。まとめる先のコミットのコメントがそのまま使われますので rebase の作業はこれで終了です。 squash の時と同じように、タイポの歴史はなかったことになりました。

exec

exec はコミットに指定するものではありません。

1
[kengo@tkengo-mac] $ git rebase -i cce19c9~1

とすると

1
2
3
pick cce19c9 通信用のクラスの実装とテストの追加
pick 70b3379 メソッド名のタイポ修正
pick aebf22c テストが落ちてたので修正

と出ますが、例えば

1
2
3
4
5
6
pick cce19c9 通信用のクラスの実装とテストの追加
exec make test
pick 70b3379 メソッド名のタイポ修正
exec make test
pick aebf22c テストが落ちてたので修正
exec make test

という風にコミットとは別の行に exec を入れこんで、その後にコマンド名を記述します。この例では各コミットの後に make test というコマンドを実行してくれます。

コミットの順番を入れ替える・削除する

rebase はコミットの順番を入れ替えることもできます。

1
[kengo@tkengo-mac] $ git rebase -i cce19c9~1

とすると

1
2
3
4
5
pick c7dbbdf 開発環境用の設定を追加
pick 18a48c3 バグ修正
pick cce19c9 通信用のクラスの実装とテストの追加
pick 70b3379 メソッド名のタイポ修正
pick aebf22c テストが落ちてたので修正

と出ますが、こんな風にコミットの順番を入れ替えたり削除したりすることができます。

1
2
3
4
pick c7dbbdf 開発環境用の設定を追加
pick cce19c9 通信用のクラスの実装とテストの追加
pick aebf22c テストが落ちてたので修正
pick 18a48c3 バグ修正

まとめ

rebase はコミットの歴史を書き換えることができます。すなわち適当にコミットしていても、リモートリポジトリに push 前であれば rebase して、コミット履歴を綺麗に保つことができます。rebase するとコミットハッシュが変わるので、リモートに push するには -f をつけて強制的に push しないといけません。

最初は実行するのがちょっと怖いですが、慣れてしまえば全然問題ありません。もし失敗したとしても git reflog などを使って過去のコミット具を参照して rebase する前のコミットを参照して元に戻したりできます。

なくても困らない rebase ですが、覚えているとなにかと便利なのでまずは練習用リポジトリでも作ってやってみてもどうでしょうか。