위의 사진처럼 현재 Working Directory는 master 브랜치
라고 가정한다면,
$ git reset HEAD~1
9e5e6a4
를 가리키게 한다.만약, reset 명령어 시 --soft 옵션을 주었다면 HEAD와 Index 그리고 Working Directory는 아래와 같은 모습일 것이다.
하지만 $ git reset HEAD~1
명령어는 따로 옵션을 주지 않아 --mixed 옵션을 넣은 것 처럼 동작하게 된다.
여기서 $ git reset HEAD~1
의 결과로 HEAD와 Index 그리고 Working Directory를 살펴보면
Index는 현재 HEAD가 가리키는 스냅샷으로 업데이트가 되었기 때문에 이후에 git commit
을 하게되면 커밋을 수정하기 위해 사용했던 $ git commit --amend
의 결과와 같아지게 된다. ( 즉, git add 명령의 상황까지 되돌린다. )
만약, reset 명령어 시 --hard 옵션을 주었다면 Working Directory까지 변경된다.
참고 ❓
Index는
Staging Area
와 동일한 개념으로$ git add
명령어로 Working Directory에 있던 파일을 Staging Area으로 옮긴 상황이다.
$ git reset HEAD~3
✔️ 해당 명령은 현재 HEAD가 가리키는 브랜치를 바꾸지 않고 현재 브랜치가 가리키는 커밋을 바꾼다.
다만, 옵션을 어떻게 주었냐에 따라 Index와 Working Directory 값이 달라진다. (해당 경우에는 Index까지)
$ git checkout master~3
✔️ 해당 명령은 HEAD 자체를 다른 브랜치로 옮긴다.
이 때, git reset --hard HEAD~3
와 같이 Working Directory까지 변경이 된다.
reset 명령어는 HEAD가 가리키는 브랜치를 움직이며 checkout 명령어는 HEAD 자체를 움직인다.
reset 명령어는 옵션에 따라 Index와 Working Directory가 변화된다.
$ git log
저장소 반영 내역 확인
% git log --graph
commit간에 연결된 관계를 아스키 그래프로 출력
Head 이동 시 유용한 명령어
$ git log --pretty=oneline
$ git checkout 이동할 커밋의 해시값