Edited at

git commit --amendで3つのコミットを1つのコミットにまとめる

本稿ではgitで直近3つのコミットを1つのコミットにまとめる方法を説明する。

本稿で詳解する方法には次の特徴がある。


  1. 最初のコミットのコミットメッセージだけが残る。


  2. git rebase -iを使わない。

ちなみに、本稿で紹介する手順を手元の環境で再現できるシェルスクリプトをGitHubで公開しているので、実験してみたい方はそちらを試してみて下さい。


やりたいこと

* 4999520 3つ目のコミット ──┐

* fbe2de7 2つ目のコミット ──┴──┐ この2つのコミットを
* 6669c6b 1つ目のコミット ←────┘ こっちにまとめ上げたい
* 0d75409 init


ステップ1: git resetで直近2つのコミットをコミット履歴から除く

まず、コミットメッセージを捨ててもいい2つ目のコミットと3つ目のコミットを、コミットログから取り除きます。

git reset --soft @~2

こうすると、直近2つのコミットはステージだけされた状態になります:

$ git status -s

M file

$ git diff --staged
diff --git a/file b/file
index c39d3eb..1b45f5b 100644
--- a/file
+++ b/file
@@ -1 +1,3 @@
改修1
+改修2
+改修3

また、コミットログは1つ目のコミットだけ残った状態になります:

$ git log --oneline --graph --all

* 6669c6b (HEAD -> master) 1つ目のコミット
* 0d75409 init


ステップ2: git commit --amendでもう一度コミットする

次に、git resetした対象を下記コマンドでコミットしなおします。

$ git commit --amend --no-edit

これにより、元々3つあったコミットが最終的に1つのコミットになります。

$ git log --oneline --graph --all

* 050afa9 (HEAD -> master) 1つ目のコミット
* 0d75409 init

差分:

$ git diff @~

diff --git a/file b/file
new file mode 100644
index 0000000..1b45f5b
--- /dev/null
+++ b/file
@@ -0,0 +1,3 @@
+改修1
+改修2
+改修3

以上で作業は完了です。