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을 취소하거나 되돌리는 방법으로는 reset과 revert 두 가지 방법이 있습니다.
Git commit을 취소하거나 되돌리는 방법으로는 reset과 revert 두 가지 방법이 있습니다.
[git 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]
• 특정 내역을 삭제하는 것이 아니라 해당 커밋의 변화를 거꾸로 수행 (추가가 있다면 삭제하고 변경이 있다면 반대로 수행)
• 결과적으로 지정한 커밋 이전의 상태로 돌아가게 됨
[예시]
(커밋 상태)
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" 상태로 되돌아가기
[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(커밋 해시 값)
[결과]
two.txt 커밋 이후의 커밋은 모두 삭제 되고 two.txt 커밋으로 되돌아가면서
프로젝트 내에는 one.txt, two.txt 파일만 남게 되었습니다.
3. revert
[명령어 정리]
$ git revert (되돌릴 커밋 해시)
[커밋해버리지 않고 revert하기]
$ git revert --no-commit (되돌릴 커밋 해시)
-> 원하는 다른 작업을 추가한 다음에 함께 커밋하는 용도로 활용할 수 있습니다.
[예시]
커밋 메시지 "two.txt" 작업 취소하기 (삭제)
(실습 전 백업해둔 .git 디렉터리를 해당 프로젝트로 다시 붙여 넣기 하여 이전 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로 저장 후 종료해줍니다.
[결과]
reset 과는 다르게
커밋 메시지 "two.txt" 이후의 커밋이 삭제되는 것이 아니라
"two.txt" 커밋 작업 내역만 삭제되었습니다. (two.txt 파일만 삭제됨을 볼 수 있습니다.)
'TOOL > Git' 카테고리의 다른 글
[Git] Git 다른 브랜치에서 원하는 Commit 가져오기 (3) | 2022.09.01 |
---|---|
[Git] Git 여러 개의 commit 합치기 (squash, git rebase -i, 병합) (0) | 2022.08.31 |
[Git] Git branch 사용하기 (branch 생성, 삭제, 이동, 수정) (0) | 2022.08.30 |
[Git] Git 기초 사용법 (Local Repository) (0) | 2022.08.28 |
[Git] Git 기초 개념 (Git 사용 전에 알고 있어야 할 개념) (0) | 2022.08.27 |