이전에 등록한 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
관련 문서
Related Posts
- Git Alias - 단축/커스텀 명령어 설정
- Git에서 .gitignore 설정 방법
- git clone 명령어로 원격 저장소를 로컬에 저장
- Git - 두개 commit의 차이점 확인 (코드 차이, 파일 차이)
- Git - 브랜치 이름 변경하는 방법
- Git - 특정 commit 삭제, 되돌리기 (reset, revert)
- Git - 리모트 브랜치 생성과 삭제
- GitHub에 ssh-key 등록 방법 (Windows10)
- git log - 특정 author의 commit 리스트만 출력
- git log - commit 리스트 간단하게 출력 (pretty)
- Git - revert 명령어(commit 되돌리기)
- git diff 명령어로 파일 변경 내용 확인
- git show 명령어로 commit 정보 확인
- Git - 브랜치 생성, 삭제, 체크아웃
- Git - 원격 저장소(remote) 추가, 해제
- Git - Staging 영역의 파일을 Untracked로 변경
- Git - commit log에서 수정된 파일 목록 보기
- Git - 마지막 commit 수정, 삭제 방법 (reset, amend 명령어)
- git commit message 에디터 변경 (Vim, Sublime, Atom, VSCode)
- Git - blame 명령어, 코드 수정한 사람과 Commit 찾기
- Git - Patch 파일 만들기 & 적용하기