コミットを「まとめたい」「消したい」ときなどに git rebase -i
が使えます。
git rebase -i
は他にも色々な操作がありますが、ここでは複数のコミットを1つにする方法と過去のコミットを削除する方法を説明します。
はじめに
例えば直近のコミットログが次のようになっているとします。
git log --oneline -3
g7h8i9 (HEAD -> hoge) テスト修正
d4e5f6 コメント修正
a1b2c3 コード修正
※上から順に新しいコミットが表示されています。
この3つのコミットを対象に、git rebase -i
の使い方を説明します。
git rebase -i の基本
git rebase -i
は「履歴を書き換えるコマンド」です。
よく使う形はこんな感じです。
git rebase -i HEAD~3
これは「直近3つのコミットを編集対象にする」という意味です。
実行すると、エディタが立ち上がって、対象のコミットが一覧で表示されます。
※上から順に古いコミットが表示されます。
複数のコミットを1つにまとめる(squash)
例えば、先ほどの3つのコミットをひとつにまとめたいとします。git rebase -i HEAD~3
を実行すると次のような画面が表示されます。
pick a1b2c3 コード修正
pick d4e5f6 コメント修正
pick g7h8i9 テスト修正
省略
コード修正 に コメント修正 と テスト修正 をまとめるよう、2つのpick
をs
に編集します。
pick a1b2c3 コード修正
s d4e5f6 コメント修正
s g7h8i9 テスト修正
省略
※s
は squash
の略です。
保存して進めると、次にコミットメッセージを編集する画面が出ます。
# This is a combination of 3 commits.
# This is the 1st commit message:
コード修正
# This is the commit message #2:
コメント修正
# This is the commit message #3:
テスト修正
省略
ここでは不要なコミットメッセージを削ったりして、最終的な1つのコミットメッセージに編集します。
# This is a combination of 3 commits.
# This is the 1st commit message:
コード修正(コメント・テスト修正含む)
# This is the commit message #2:
# This is the commit message #3:
省略
保存すると先ほどの3つのコミットが コード修正(コメント・テスト修正含む) というコミットメッセージで1つにまとめられます。
複数のコミットを1つにまとめる(fixup)
fixup
を使ってもsquash
と同じように、複数のコミットを1つにまとめることができます。squash
との違いは、コミットをまとめる際にメッセージの編集がスキップされることです。
git rebase -i HEAD~3
を実行します。
pick a1b2c3 コード修正
pick d4e5f6 コメント修正
pick g7h8i9 テスト修正
省略
コード修正 に コメント修正 と テスト修正 をまとめるよう、2つのpick
をf
に編集します。
pick a1b2c3 コード修正
f d4e5f6 コメント修正
f g7h8i9 テスト修正
省略
※f
は fixup
の略です。
保存すると先ほどの3つのコミットが コード修正 というコミットメッセージで1つにまとめられます。
過去のコミットを削除する(drop)
もし「このコミットいらなかったな」と思った場合は削除できます。git rebase -i HEAD~3
を実行します。
pick a1b2c3 コード修正
pick d4e5f6 コメント修正
pick g7h8i9 テスト修正
省略
今回は コメント修正 を削除するためにpick
をd
に編集します。
pick a1b2c3 コード修正
d d4e5f6 コメント修正
pick g7h8i9 テスト修正
省略
※d
は drop
の略です。
保存することで、この指定をしたコミットは履歴から消えます。
まとめ
squash
: コミットをまとめて新しいコミットメッセージを作成したいときfixup
: コミットをまとめて元のコミットメッセージをそのまま使いたい(編集をスキップしたい)ときdrop
: 過去のコミットを削除したいとき
最後に
git rebase -i
は履歴を書き換えるので、すでにリモートにpushしたコミットをいじるときは注意が必要です。
ちなみに、push済みコミットを書き換えた場合、単純にgit push
できないので --force-with-lease
オプションが必要です。
git push --force-with-lease origin ブランチ名
また、操作を間違えたり予想外な結果になっても対処できるように、git reflog
で戻せることも覚えておくと安心です。
【Git】間違って git rebase -i したのを元に戻す方法
コメント