[Git] HEAD 알아보기
HEAD란
git 에서 HEAD는 어떤 커밋 하나를 가리키는 존재이다.
보통 가장 최근 업데이트 된 커밋을 가리키며, 매번 새로운 커밋을 가리킨다.
이에 HEAD 가 가리키는 커밋에 따라 working directory의 내용이 구성된다.
엄밀히 말하자면 HEAD는 커밋이 아닌, 커밋을 가리키고 있는 브랜치를 가리키는 포인터이다.
이는 브랜치에 대해 작성하면서 더 자세히 다뤄보겠다 !
이전 커밋으로 돌아가기
reset 커맨드를 통하여 이전 커밋으로 돌아갈 수 있다.
git reset --hard <이동할 커밋 아이디>
이는 HEAD 가 가르키는 커밋이 변경되는 형식이다.
reset의 3가지 옵션
reset의 3가지 옵션은 깃의 3가지 작업 영역 (working directory, staging area, repository) 과 관련되어 있다.
--hard
3가지 영역 모두 해당하는 커밋의 내용으로 변경된다.
즉 모든 값들이 이전 커밋의 내용으로 돌아간다.
--mixed
repository 와 staging area의 값만 변경되고, working directory의 값은 유지된다.
--soft
repository만 변경된다.
여러 커밋을 하나의 커밋으로
위 커밋에서 가장 최신의 커밋을 1번 커밋이라 하자.
기능을 수정하였으므로 2번 커밋은 필요없는 커밋이 되었다.
따라서 두개의 커밋을 하나의 커밋으로 통합하는 것이 더 보기 좋은 흐름이 될 것이다.
이를 위해 reset 커맨드를 사용할 수 있다.
단, 이때 현재의 working directory의 내용은 유지되어야 한다.
즉 우리는 현재 작업 내용에 대한 커밋을 새롭게 해주기 위해 HEAD를 이전으로 옮겨야 하며, 이 과정에서 working directory는 변경되어서는 안 된다.
따라서 reset의 옵션 중 mixed와 soft 옵션을 사용해주면 되겠다.
새롭게 커밋을 해주어서 커밋 아이디가 변경된 모습을 확인할 수 있다.
HEAD를 기준으로 reset 하기
커밋 아이디를 작성하지 않고 현재 HEAD의 위치를 기준으로 reset할 commit 을 설정할 수도 있다.
HEAD가 가리키는 바로 직전 커밋으로 reset
git reset HEAD^
HEAD가 가리키는 커밋에서 N단계 전의 커밋으로 reset
git reset HEAD~N
Rest을 하여도 커밋이 삭제되는 건 아니다
reset을 통해 이전 커밋으로 돌아가면 커밋이 log 내역에는 보이지는 않지만 reflog 시스템을 통하여 기록되어있다.
따라서 커밋이 완전히 삭제되는 것은 아니기 때문에 다시 원래 커밋으로 돌아갈 수 있다.
현재 커밋 내역들이다.
여기서 아이디가 e4b3인 커밋으로 이동을 한다.
HEAD가 잘 이동되었다.
여기서 원래 커밋들의 커밋 아이디만 잘 알고 있으면 언제든지 해당 커밋들로 돌아갈 수 있다.
다시 최신 커밋으로 돌아왔으며, 그 사이에 있던 커밋들 역시 복원된 모습을 볼 수 있다.
만약 커밋 아이디를 까먹었다면
git reflog
해당 커맨드를 통하여 모든 커밋 내역들을 살펴볼 수 있다.
다음과 같이 현재 위치하고 있는 브랜치뿐만 아니라 다른 브랜치에서의 커밋 내역들까지 확인할 수 있다.