Reset
3가지 Tree
Git은 일반적으로 세가지 트리를 관리하는 시스템이다.
트리 | 역할 |
---|---|
HEAD | 마지막 커밋 스냅샷, 다음 커밋의 부모 커밋 |
Index | 다음에 커밋할 스냅샷 |
워킹 디렉토리 | 샌드박스 |
HEAD
현재 가리키는 포인터
브랜치에 담긴 커밋 중 가장 최근 커밋을 가리킴
Index
- 바로 다음에 커밋할 것들(Staging Area에 있는 것들)
워킹 디렉토리
- 실제 파일로 존재한다.
- 사용자가 직접 파일을 수정할 수 있는 파일로 존재
Reset의 역할
위의 세가지 트리에 대해서 이해하면 Reset을 쉽게 이해할 수 있다.
1단계 : HEAD 이동 (–soft)
먼저 git reset 9e5e6a4
명령은 master
브랜치가 9e5e6a4
를 가리키게 한다.
여기서 주목해야할점은 HEAD만 새로운 커밋을 가리키고, Index와 Working Directory는 같은 커밋을 가리킴을 확인할 수 있다.
이 상태에서 git commit
을 실행하면 git commit --amend
명령과 같아진다.
2단계 : Index 업데이트(–mixed)
mixed를 옵션으로 사용하면 다음과 같이 Index까지 새로운 커밋을 가리킨다.
3단계 : 워킹 디렉토리 업데이트(–hard)
–hard 옵션은 워킹 디렉토리까지 업데이트 한다. 워킹 디렉토리에 있는 정보는 이전에 커밋한 기록이 없다면, 영구적으로 삭제되므로 주의해야한다.
요약
reset
명령은 정해진 순서대로 세 개의 트리를 덮어써 나가다가 옵션에 따라 지정한 곳에서 멈춘다.
- HEAD가 가리키는 브랜치를 옮긴다. (
--soft
옵션이 붙으면 여기까지) - Index를 HEAD가 가리키는 상태로 만든다. (
--hard
옵션이 붙지 않았으면 여기까지) - 워킹 디렉토리를 Index의 상태로 만든다.