Git - 最後のコミットを修正、削除する方法(reset、amend命令)

以前に登録したコミットを削除するか、内容を変更して別のコミットに登録する方法を紹介します。

1. 例で使用される git ブランチの commit リスト

この記事で例として使用されるgitのコミットのリスト。

次のように3つのコミットが登録されました。そして最後に登録した「Third commit」に問題が発見され、修正をしたいと思います。

$ git log
commit 5ca58dbd90777fb15f4dbecbf02225604956e478 (HEAD -> master)
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:25:16 2021 +0900

    Third commit

commit 018bf8778f4ee3d2fcb0791865412c92a5142400
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:25:00 2021 +0900

    Second commit

commit 0b9490b1ad37be391d8d1dde727c62c7cc707819
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:24:39 2021 +0900

    First commit

2. 最後のコミットを元に戻し、修正後他のコミットに反映

git reset --soft HEAD~1 は最近反映した commit 1 個を取り消し、修正内容を staged 状態にして再修正が可能にします。

~Nは返すコミット数を意味します。 ~2 は最近 commit 2 つを元に戻すという意味です。

次のように命令を入力すると、「3rd commit」(commit 5ca58)が削除され、修正内容はstaged状態のままです。

$ git reset --soft HEAD~1


$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   Test.java
$ git diff --cached
diff --git a/Test.java b/Test.java
index c61686b..6ae8c92 100644
--- a/Test.java
+++ b/Test.java
@@ -1,2 +1,3 @@
 First commit
-Second commit
\ No newline at end of file
+Second commit
+Third commit
\ No newline at end of file

コードを修正して再びgit commitに反映すると、他のcommitに適用されます。新しいコミットとして登録されるので、コミットメッセージも変更できます。

$ git log
commit 2ef469a827eee90935d8a28d787264456b7e67ee (HEAD -> master)
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:26:50 2021 +0900

    Third commit (+ fix)

commit 018bf8778f4ee3d2fcb0791865412c92a5142400
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:25:00 2021 +0900

    Second commit

commit 0b9490b1ad37be391d8d1dde727c62c7cc707819
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:24:39 2021 +0900

    First commit

3. 修正を最後のコミットに追加する

git commit --amend コマンドを使用すると、commit を元に戻さずに、変更した内容を最後の commit に追加できます。

つまり、追加で変更した内容が最後のコミットの変更と合わせられるようになり、コミットメッセージを変更することもできます。

たとえば、次のように追加修正しました。 git diffを試してみると、変更内容が見えます。

$ git diff
diff --git a/Test.java b/Test.java
index 7a9e8cc..bb52d56 100644
--- a/Test.java
+++ b/Test.java
@@ -1,3 +1,3 @@
 First commit
 Second commit
-Third commit(+ fix)
\ No newline at end of file
+Third commit(+ fix + fix)
\ No newline at end of file

この修正を最後のコミットと合わせたい場合は、 git commit --amend コマンドでコミットするだけです。その後、最新のコミットが修正され、これらの内容がまとめられます。

$ git commit --amend
[master dc29857] Third commit (+ fix + fix)
 Date: Thu Jun 17 22:26:50 2021 +0900
 1 file changed, 2 insertions(+), 1 deletion(-)

git logでコミットリストを見ると、新しいコミットが追加されず、コミットメッセージが変更されたことがわかります。

$ git log
commit dc29857d0a832afaf7504542d09f8f7f6b721638 (HEAD -> master)
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:26:50 2021 +0900

    Third commit (+ fix + fix)

commit 018bf8778f4ee3d2fcb0791865412c92a5142400
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:25:00 2021 +0900

    Second commit

commit 0b9490b1ad37be391d8d1dde727c62c7cc707819
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:24:39 2021 +0900

    First commit

最後のコミットの修正を見ると、追加で修正した内容が適用されます。

commit dc29857d0a832afaf7504542d09f8f7f6b721638 (HEAD -> master)
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:26:50 2021 +0900

    Third commit (+ fix + fix)

diff --git a/Test.java b/Test.java
index c61686b..7a9e8cc 100644
--- a/Test.java
+++ b/Test.java
@@ -1,2 +1,3 @@
 First commit
-Second commit
\ No newline at end of file
+Second commit
+Third commit(+ fix)
\ No newline at end of file

4. 最後のコミット削除後に再コミットを反映

次のように --hard オプションは commit を削除し、修正内容を staged 状態に置かずに削除します。

$ git reset --hard HEAD~1
HEAD is now at 018bf87 Second commit

statusをチェックすると、staged状態に残っているものはありません。

$ git status
On branch master
nothing to commit, working tree clean

ログを見ると、最後のコミットが削除されたことを確認できます。

$ git log
commit 018bf8778f4ee3d2fcb0791865412c92a5142400 (HEAD -> master)
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:25:00 2021 +0900

    Second commit

commit 0b9490b1ad37be391d8d1dde727c62c7cc707819
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:24:39 2021 +0900

    First commit

これでコードを修正してもう一度コミットします。

$ git commit
[master 0b831ac] Third new commit
 1 file changed, 2 insertions(+), 1 deletion(-)


$ git log
commit 0b831acb6fb6200d45961a89b61f75d3a0de3576 (HEAD -> master)
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:56:42 2021 +0900

    Third new commit

commit 018bf8778f4ee3d2fcb0791865412c92a5142400
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:25:00 2021 +0900

    Second commit

commit 0b9490b1ad37be391d8d1dde727c62c7cc707819
Author: JS <farfs.dev@gmail.com>
Date:   Thu Jun 17 22:24:39 2021 +0900

    First commit
codechachaCopyright ©2019 codechacha