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

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

1. 예제에서 사용되는 git 브랜치의 commit 리스트

이 글에서 예제로 사용되는 git의 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

2. 마지막 commit을 되돌리고, 수정 후 다른 commit으로 반영

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

코드 수정을 하고 다시 git commit으로 반영하면, 다른 commit으로 적용됩니다. 새로운 commit으로 등록되는 것이기 때문에 commit message도 변경할 수 있습니다.

$ 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. 수정사항을 마지막 commit에 추가하기

git commit --amend 명령어를 사용하면 commit을 되돌리지 않은 상태에서, 수정한 내용을 마지막 commit에 추가할 수 있습니다.

즉, 추가로 수정한 내용이 마지막 commit의 변경사항과 합쳐지게 되며, commit message를 변경할 수도 있습니다.

예를 들어, 다음과 같이 추가로 수정하였습니다. 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

이 수정사항을 마지막 commit과 합치고 싶다면, git commit --amend 명령어로 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(-)

git log로 commit 리스트를 보면 새로운 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

4. 마지막 commit 삭제 후 다시 commit 반영

다음과 같이 --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

로그를 보면 마지막 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