Git - 마지막 commit 수정, 삭제 방법 (reset, ammend 명령어)

이전에 등록한 commit을 삭제하거나 수정하여 다시 등록하는 방법을 소개합니다.

예제와 함께 명령어 사용 방법을 알아보겠습니다.

문제 상황 소개

다음과 같이 3개의 commit을 등록하였습니다.

이 때, 가장 마지막에 등록한 "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

1. 마지막 commit 수정 : git reset --soft HEAD~1

git reset --soft HEAD~1는 가장 최근에 반영한 commit 1개를 취소하고, 수정 내용을 staged 상태로 만들어 다시 수정이 가능하도록 합니다.

~N은 되돌릴 commit 개수를 의미합니다. ~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

수정을 하고 다시 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

2. 마지막 commit 수정 : git commit --amend

commit을 되돌리지 않은 상태에서, 파일을 수정하고 --amend 옵션으로 commit을 하는 방법이 있습니다.

예를 들어, 다음과 같이 수정하였습니다. 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 명령어로 commit을 하면, 새로운 commit이 추가되지 않고, 가장 최근의 commit이 수정됩니다.

$ 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(-)

새로운 commit이 추가되지 않고, commit 메시지가 변경된 것을 볼 수 있습니다.

$ 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의 수정사항을 보면, 다시 수정한 것이 적용되었습니다.

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

3. 마지막 commit 삭제 후 다시 commit 반영 : git reset --hard HEAD~1

다음과 같이 --hard 옵션은 commit을 삭제하고, 수정 내용을 staged 상태에 두지 않고 삭제합니다. commit 뿐만 아니라 수정 내용이 모두 삭제됩니다.

$ 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

로그를 보면 마지막 commit이 삭제된 것을 확인할 수 있습니다.

$ 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

이제 코드를 수정 하고 다시 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
Loading script...
codechachaCopyright ©2019 codechacha