Git

[Git] HEAD 알아보기

P1su 2024. 8. 3. 00:55

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

해당 커맨드를 통하여 모든 커밋 내역들을 살펴볼 수 있다. 

 

다음과 같이 현재 위치하고 있는 브랜치뿐만 아니라 다른 브랜치에서의 커밋 내역들까지 확인할 수 있다. 

728x90