본문으로 바로가기

[Git] Git commit 취소하기, 되돌리기 (reset, revert)

category TOOL/Git 2022. 8. 29. 14:05

0. 환경

  • m1 macbook
  • IntelliJ (Vscode 등 다른 툴을 활용해도 됩니다.)
  • git version 2.37.0

 

[실습 전 Git commit 상태]

one.txt 파일 추가 →  git add . ; git commit -m "one.txt"

 two.txt 파일 추가 →  git add . ; git commit -m "two.txt"

 three.txt 파일 추가 →  git add . ; git commit -m "three.txt"

 four.txt 파일 추가 →  git add . ; git commit -m "four.txt"

 five.txt 파일 추가 →  git add . ; git commit -m "five.txt" 

 

reset, revert 실습을 위해 프로젝트 내 .git 디렉터리는 백업해 둡니다.

 

1. reset vs revert

Git commit을 취소하거나 되돌리는 방법으로는 resetrevert 두 가지 방법이 있습니다.

Git commit을 취소하거나 되돌리는 방법으로는 reset과 revert 두 가지 방법이 있습니다.

 

[git reset]

네이버 영어사전 reset

특정 과거로 되돌리면서 이후의 히스토리(commit)는 삭제


[예시]

(커밋 상태)

commit message : 1 (commit hash = 1)

commit message : 2 (commit hash = 2)

commit message : 3 (commit hash = 3)

 

(reset 작업)

git reset --hard 1

 

(결과 : 커밋 상태)

commit message : 1 (commit hash = 1)

→ 1번 커밋 이후의 커밋들은 삭제가 됩니다.

 

[git revert]

네이버 영어사전 revert

특정 내역을 삭제하는 것이 아니라 해당 커밋의 변화를 거꾸로 수행 (추가가 있다면 삭제하고 변경이 있다면 반대로 수행)

결과적으로 지정한 커밋 이전의 상태로 돌아가게 됨

 

[예시]

(커밋 상태)

commit message : 1 (commit hash = 1)

commit message : 2 (commit hash = 2)

commit message : 3 (commit hash = 3)

 

(revert 작업)

git revert 2

 

(결과 : 커밋 상태)

commit message : 1 (commit hash = 1)

commit message : 2 (commit hash = 2)

commit message : 3 (commit hash = 3)

commit message : Revert "2" (commit hash = 4)

→ 2번 커밋에서의 작업을 거꾸로 수행commit을 남깁니다.  (2번 작업 내역 취소)

2번 커밋 이후의 커밋들이 삭제되는 것이 아니라, 2번 커밋에 해당하는 내용만 삭제

 

[reset vs revert]

[reset]

reset의 경우에는 특정 커밋만을 취소할 수 없습니다.

즉, 취소할 커밋이 중간에 있는 경우 되돌릴 수 없습니다. (특정 커밋 이후의 커밋은 모두 취소됨)

 

[revert]

그러나 

revert의 경우에는 특정 커밋만을 취소할 수 있고

추가적으로 이전으로 되돌렸다는 이력(commit message)를 남겨 이력 관리 차원에서도 좋습니다.

 

 

2. reset

[명령어 정리]

현재 위치에서 바로 이전 커밋으로 되돌리기(현재 커밋 취소), ^의 개수에 따라 여러 개의 이전으로 돌아 갈 수 있습니다.
$ git reset --option HEAD^

^말고 ~숫자로도 여러 개의 이전으로 돌아갈 수 있습니다.
$ git reset --option HEAD~5

특정 커밋 해시 상태로 돌아갈 수 있습니다.
$ git reset --option (되돌릴 커밋 해시)

 

[reset option]

[reset의 세 가지 옵션]
 --soft: repository에서 staging area로 이동 (add 까지 된 상태)
 --mixed (default): repository에서 working directory로 이동 (add 되기 전 상태)
 --hard: 수정사항 완전히 삭제

 

[예시]

커밋 메시지 "two.txt" 상태로 되돌아가기

IntelliJ Git

 

[git commit 확인하기]
$ git log
commit b6a31f16682e32ae4809a2546a3259684fff5dea (HEAD -> main)
Author: 
Date:   Sun Aug 28 14:02:11 2022 +0900

    four.txt

commit 891e3eb42be93c23a13c7988953780348def9612
Author: 
Date:   Sun Aug 28 14:01:51 2022 +0900

    three.txt

commit 5b0149f8ed0242ce77f6e14007974836bebc2f6c
Author: 
Date:   Sun Aug 28 14:01:31 2022 +0900

    two.txt

commit 8b36bffc8ccb0c442391740ba120192a5e584abe
Author: 
Date:   Sun Aug 28 14:00:49 2022 +0900

    one.txt

[reset]
$ git reset --hard 5b0149f8

5b0149f8 = two.txt(커밋 해시 값)

IntelliJ Git

 

[결과]

two.txt 커밋 이후의 커밋은 모두 삭제 되고 two.txt 커밋으로 되돌아가면서 

프로젝트 내에는 one.txt, two.txt 파일만 남게 되었습니다.

 

3. revert

[명령어 정리]

$ git revert (되돌릴 커밋 해시)

[커밋해버리지 않고 revert하기]
$ git revert --no-commit (되돌릴  커밋 해시)
-> 원하는 다른 작업을 추가한 다음에 함께 커밋하는 용도로 활용할 수 있습니다.

 

[예시]

커밋 메시지 "two.txt" 작업 취소하기 (삭제)

(실습 전 백업해둔 .git 디렉터리를 해당 프로젝트로 다시 붙여 넣기 하여 이전 Git 상태로 복구합니다.)

IntelliJ Git

 

[git commit 확인하기]
$ git log
commit b6a31f16682e32ae4809a2546a3259684fff5dea (HEAD -> main)
Author: 
Date:   Sun Aug 28 14:02:11 2022 +0900

    four.txt

commit 891e3eb42be93c23a13c7988953780348def9612
Author: 
Date:   Sun Aug 28 14:01:51 2022 +0900

    three.txt

commit 5b0149f8ed0242ce77f6e14007974836bebc2f6c
Author: 
Date:   Sun Aug 28 14:01:31 2022 +0900

    two.txt

commit 8b36bffc8ccb0c442391740ba120192a5e584abe
Author: 
Date:   Sun Aug 28 14:00:49 2022 +0900

    one.txt

[revert]
$ git revert 5b0149f8

5b0149f8 = two.txt(커밋 해시 값)

 

터미널로 Git 명령어 실행 시 revert 할 경우 vi 편집기 사용법과 같은 방식으로 :wq로 저장 후 종료해줍니다.

IntelliJ Git terminal

 

[결과]

reset 과는 다르게

커밋 메시지 "two.txt" 이후의 커밋이 삭제되는 것이 아니라

"two.txt" 커밋 작업 내역만 삭제되었습니다. (two.txt 파일만 삭제됨을 볼 수 있습니다.)

IntelliJ Git