reset의 종류는 3가지이다.
- soft
- mixed
- hard
어떤 영역까지 삭제해야 하는지를 기준으로 나뉘고 아래로 갈 수록 더 많은 영역을 삭제한다.
차례대로 알아가보도록 하자.
1. soft reset
soft reset는 헤더영역만 삭제(커밋된 내용만 삭제)하는 것으로 주로 커밋로그를 변경할 때 사용된다.
실습을 통해 배워보자.
실습 전제: test1.txt 파일이 first commit으로 들어왔고, test2.txt파일이 second commit으로 들어온 상태이다.
깃 로그를 확인해보자. 그리고 git reset 명령어를 사용해보자.
commit 옆에 해쉬코드가 길게 늘어서 있다. 해쉬코드 4~5글자 정도를 복사해서 명령에 맨 뒤에 넣어주면 된다.
$ git reset --soft 92ba7
현재 버전인 (HEAD->master)라고 되어 있는 것의 해쉬코드를 넣으면 아무일도 일어 나지 않는다.
이미 현재 버전인 상태이기 때문이다. 예전 버전의 해쉬 코드를 적으면 예전 버전으로 돌아갈 수 있다.
- git log로 헤더 영역 확인하기
$ git log
commit 92ba72383c65c86471a64865876f4a269b72c447 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 13:45:49 2022 +0900
first commit
second commit이 사라진 것을 확인할 수 있다.
- git status로 인덱스 영역 확인하기
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: test2.txt
인덱스 영역에 commit 명령으로 없어졌던 test2.txt 파일이 다시 생겼을 것이다. 이 파일은 다시 commit 명령어를 통해 헤더 영역으로 넣을 수 있다. 만약 커밋메시지를 잘못 썼을 때 soft reset을 통해 변경하면 쉬울 것이다.
보너스: 커밋로그가 하나밖에 없을 때 로그바꾸는 법
$ git commit --amend -m "re commit"
위 명령어를 사용하면 (HEAD->master)로 설정되어있는 현재 커밋로그를 변경할 수 있다.
커밋로그가 하나밖에 없을 경우, reset을 할 수 없기때문에 위 방법을 사용하면 되겠다.
2. mixed reset
mixed reset는 인덱스 영역, 헤더 영역을 삭제하는 것이다.
작업 영역의 내용 변경이 필요할 때 인덱스, 헤더 영역을 삭제하고 다시 작업하여 add할 때 사용한다.
사실 mixed reset를 사용하기보다는 파일을 수정해서 "커밋 ver.2"식으로 다시 커밋하는 것이 훨씬 편하다. 그렇기 때문에 mixed reset를 사용하는 경우는 거의 없다고 봐도 된다.
- 현재 커밋 로그 상태
$ git log
commit 6bbead0e3039a48fe718bf16f7697eeb06c54dfa (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 13:57:21 2022 +0900
secone commit
commit 92ba72383c65c86471a64865876f4a269b72c447
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 13:45:49 2022 +0900
first commit
mixed reset은 soft reset과 사용 방법은 비슷하다.
$ git reset --mixed 92ba7
- git log
$ git log
commit 92ba72383c65c86471a64865876f4a269b72c447 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 13:45:49 2022 +0900
first commit
second commit이 삭제된 것을 확인할 수 있다.
- git status
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
test2.txt
nothing added to commit but untracked files present (use "git add" to track)
soft reset과는 다르게 Untracked files로 식별된다. 인덱스 영역에서도 삭제됐기 때문이다.
test2.txt는 현재 작업 영역에서 남아있다. git add를 통해 인덱스 영역에 다시 넣을 수 있다.
3. hard reset
마지막으로 hard reset은 작업 영역(폴더), 인덱스 영역, 헤더 영역 전부 삭제하는 것으로, 작업 영역 또한 이전 버전으로 되돌리고 싶을 때 사용한다.
- 현재 커밋 로그 상태
$ git log
commit 56606c2f421cd0f2ce4e7df5e17c088fc0af5ca9 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 14:11:39 2022 +0900
second commit
commit 92ba72383c65c86471a64865876f4a269b72c447
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 13:45:49 2022 +0900
first commit
hard reset을 실행해보자.
$ git reset --hard 92ba7
- git log
$ git log
commit 92ba72383c65c86471a64865876f4a269b72c447 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 13:45:49 2022 +0900
first commit
-git status
$ git status
On branch master
nothing to commit, working tree clean
남아있는 파일이 없다고 뜬다.
폴더를 직접 확인해보면, test2.txt가 아예 삭제된 것을 확인할 수 있다.
이렇게 삭제한 파일은 휴지통에서도 찾을 수가 없다.
대신 reset --hard 명령어와 reflog 명령어를 통해 복구할 수 있다.
보너스: 복구하는 방법
- git reflog
$ git reflog
92ba723 (HEAD -> master) HEAD@{0}: reset: moving to 92ba
56606c2 HEAD@{1}: commit: second commit
92ba723 (HEAD -> master) HEAD@{2}: reset: moving to 92ba
6bbead0 HEAD@{3}: commit: secone commit
92ba723 (HEAD -> master) HEAD@{4}: reset: moving to 92ba7
4c45a85 HEAD@{5}: commit: second commit
92ba723 (HEAD -> master) HEAD@{6}: commit (initial): first commit
git reflog 명령어를 사용하면 한 번이라도 커밋했던 로그들을 다 보여준다.
앞에 숫자와 알파벳이 섞인 것은 커밋로그의 해쉬코드이다.
- 값 복구하기
$ git reset --hard 56606
HEAD is now at 56606c2 second commit
$ git log
commit 56606c2f421cd0f2ce4e7df5e17c088fc0af5ca9 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 14:11:39 2022 +0900
second commit
commit 92ba72383c65c86471a64865876f4a269b72c447
Author: BigBell <pythonstrup@gmail.com>
Date: Thu Feb 10 13:45:49 2022 +0900
first commit
reset을 통해 복구한 결과이다. second commit이 다시 돌아와있는 것을 확인할 수 있다.
폴더에도 복구되어 있다.