0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

コミットを「まとめたい」「消したい」ときなどに 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 したのを元に戻す方法

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?