Git을 사용하여 커밋을 하다 보면 커밋 내역이 차곡차곡 쌓인다. 그런데 코딩을 하다 보면 커밋 기록을 취소하거나 과거로 돌아가야 할 일이 생긴다. 이때 사용할 수 있는 명령어가 바로 reset 또는 revert이다.
reset, revert 차이점
- reset - 특정 커밋으로 돌아간 다음 이후 행적은 히스토리에서 지워버린다.
- revert - 특정 커밋의 변경 내용을 반대로 실행하고 revert했다는 커밋을 하나 더 추가한다.
즉 reset으로 과거로 돌아가면 아예 없었던 일이 되지만 revert로 돌아가면 변경 내용만 롤백해주고 커밋 내역은 남아 있는 것이다.
예시
다음과 같이 4개의 커밋이 있다고 하자.
commit bbaa3d2e16c2445bf96a20e1eb3518afa84bbdd8 (HEAD -> master)
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:37:40 2022 +0900
커밋4
commit 2115c8cf0d364f532735ae70098cad2a0bafb256
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:53 2022 +0900
커밋3
commit 3abd1d3e9c3f4a59ff0c51018d8fb477519be451
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:33 2022 +0900
커밋2
commit 63fec533d4b2eb22c1ee8081480b71039521f7a8
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:07 2022 +0900
커밋1
이 상태에서 커밋4를 없었던 일로 하고 커밋3으로 돌아가고 싶으면 커밋3의 해시를 이용해 reset
$ git reset --hard 2115c8cf0d364f532735ae70098cad2a0bafb256
HEAD is now at 2115c8c 커밋3
commit 2115c8cf0d364f532735ae70098cad2a0bafb256 (HEAD -> master)
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:53 2022 +0900
커밋3
commit 3abd1d3e9c3f4a59ff0c51018d8fb477519be451
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:33 2022 +0900
커밋2
commit 63fec533d4b2eb22c1ee8081480b71039521f7a8
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:07 2022 +0900
커밋1
그럼 커밋4는 사라지고 커밋3으로 돌아온 것을 확인할 수 있다.
여기서 또 커밋 2로 돌아가고 싶지만 커밋3의 내역은 지우고 싶지 않을 때 revert를 사용한다.
주의할 점은 reset할 때는 돌아가고 싶은 커밋 해시를 사용했지만 revert는 없었던 일로 하고 싶은 커밋의 해시를 써야 한다. 즉 커밋3의 변경내용을 롤백하고 싶으므로 커밋3의 해시를 이용한다.
$ git revert 2115c8cf0d364f532735ae70098cad2a0bafb256
Removing src/main/java/Commit3.java
[master 8f9bee3] Revert "커밋3"
commit 8f9bee3fc84d65718a49154e5f4b09a06a3d4524 (HEAD -> master)
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:50:41 2022 +0900
Revert "커밋3"
This reverts commit 2115c8cf0d364f532735ae70098cad2a0bafb256.
commit 2115c8cf0d364f532735ae70098cad2a0bafb256
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:53 2022 +0900
커밋3
commit 3abd1d3e9c3f4a59ff0c51018d8fb477519be451
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:33 2022 +0900
커밋2
commit 63fec533d4b2eb22c1ee8081480b71039521f7a8
Author: DOES <ldk980130@gmail.com>
Date: Sat Feb 19 15:36:07 2022 +0900
커밋1
이렇게 하면 커밋은 하나 더 늘어났지만 커밋2 때와 head의 상태는 같은 내용이 된다.
또 하나 주의할 점은 revert는 여러 커밋을 뛰어넘는 되감기를 해주지는 못한다. revert로 내가 커밋4에 있는데 커밋 1로 돌아가고 싶으면 revert 커밋4, revert 커밋3, revert 커밋2를 차례대로 진행해야 한다.
원격 저장소에 push된 커밋 지우기
이미 원격 저장소에 push된 이력을 reset으로 되돌리고 싶으면 다음과 같이 하면 된다.
- 돌아갈 커밋으로 reset하기
- $ git push -f origin master
'Git' 카테고리의 다른 글
Git 정리 세 번째 Branch, Merge, Rebase (0) | 2022.03.06 |
---|---|
[Git] Upstream과 Origin이란? (0) | 2022.02.16 |
Git 정리 첫 번째 (로컬 저장소, init, add, commit, .gitignore, 개행문자 통일) (0) | 2022.02.12 |