【Git】コミットを「まとめたい」「消したい」ときは git rebase -i

Git
記事内に広告が含まれています。

コミットを「まとめたい」「消したい」ときなどに 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つのpicksに編集します。

pick a1b2c3 コード修正
s d4e5f6 コメント修正
s g7h8i9 テスト修正

省略

ssquash の略です。

保存して進めると、次にコミットメッセージを編集する画面が出ます。

# 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つのpickfに編集します。

pick a1b2c3 コード修正
f d4e5f6 コメント修正
f g7h8i9 テスト修正

省略

ffixup の略です。

保存すると先ほどの3つのコミットが コード修正 というコミットメッセージで1つにまとめられます。

過去のコミットを削除する(drop)

もし「このコミットいらなかったな」と思った場合は削除できます。
git rebase -i HEAD~3を実行します。

pick a1b2c3 コード修正
pick d4e5f6 コメント修正
pick g7h8i9 テスト修正

省略

今回は コメント修正 を削除するためにpickdに編集します。

pick a1b2c3 コード修正
d d4e5f6 コメント修正
pick g7h8i9 テスト修正

省略

ddrop の略です。

保存することで、この指定をしたコミットは履歴から消えます。

まとめ

  • 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 したのを元に戻す方法

最後までお読みいただきありがとうございました。

皆さんからのコメントやSNSでのシェア、嬉しい投稿をいただくと本当に励みになります。

もしこの記事が気に入ったら感想をコメントやSNSでシェアしていただけると嬉しいです。

皆さんの声を聞かせてくださいね!

Git
tetsuをフォローする
簿記はじめるってよ

コメント

タイトルとURLをコピーしました