git HEAD 란?

미누도 개발한다·2021년 11월 7일
7

목록 보기
4/4

HEAD 포인터 란?

❗️git을 처음사용하면, head는 현재 바라고보고있는 커밋을 가리키는건지, 현재 브랜치 이름을 가리키는건지 헷갈리는 경우가 있을 것입니다.

HEAD는 현재 체크아웃된 브랜치의 가장 최신커밋을 가리킵니다.
따라서 branch를 변경하게되면, 변경한branch의 가장 최신commit을 가리키게 됩니다. 이렇게 될 경우, 보통 HEAD는 브랜치 이름을 가리키도록 표시됩니다.
(커밋옆에 브랜치 이름은, 해당 브랜치의 가장 최상단 커밋에 표시됩니다.)
-> 11.28일 내용을 추가했습니다! 최하단 수정내용을 참고하고 읽어주세요!

예시를 통해 간단히 살펴보겠습니다.

💡
main 브랜치에서 "상품정보" 커밋을 하고, elice 브랜치를 생성하고, elice브랜치로 checkout 하였습니다. 이후 "Add m2.js" 커밋을 한 상태입니다.

🙋‍현재 elice 브랜치에 있지만, main브랜치의 커밋이 보이는 이유는, main 브랜치에서 '상품정보' 커밋 이후 갈라져 생성되었기 때문입니다.
브랜치가 갈라진 이후에는 각 브랜치가 독립적이므로, 다른 브랜치에서 작업한 커밋이 보이지 않는게 당연합니다.

📌
따라서, HEAD -> elice 의 뜻은, 현재 체크아웃되어있는 브랜치는 elice이고, 현재 HEAD가 "Add m2.js" 커밋을 바라보고있다 라는 의미입니다.

HEAD는 현재 내가 바라보고있는 commit을 가리킨다.

라고 생각하면 되겠습니다. 다만, HEAD가, 현재 브랜치의 가장 최상단 커밋을 바라보고있다면, HEAD-> 브랜치명 으로 표시될 뿐입니다.
HEAD -> elice 와 같은것을 보고, HEAD는 브랜치를 가리키는것 아닌가? 라고 착각 할만한 요소가 분명히 있는 것 같습니다.
따라서 브랜치명과 분리된(?) 모양의 HEAD를 보여드리겠습니다.
아래는, elice 브랜치에서 , "상품정보" 커밋으로 checkout 한 경우입니다.

HEAD는 현재 과거 커밋을 바라보고 있으므로, "Add m2.js" 커밋이 보이지가 않습니다.
git log --all 을 통해, 전체 커밋을 보면 아래와 같습니다.

위에서 보이는 것처럼, HEAD는 현재 보고있는 커밋을 가리킬뿐, 현재 유저가 어느 브랜치에 checkout 했는지에 대한 정보는 없습니다.


+) 11월 28일 추가

HEAD가 어떻게 관리가 되는지 뜯어보았습니다.
숨김폴더인 .git에 접근하면 아래와 같은 폴더들을 볼 수 있습니다.


HEAD란?

cat으로 HEAD를 찍어봤더니 HEAD는 ref 랍니다.
즉, 현재 체크아웃된 브랜치를 가르킵니다. 두번째는 git checkout child
를 통해 child 브랜치로 이동한 다음, cat을 찍은 결과입니다.

정리하자면, git에서 HEAD 포인터는, 현재 checkout 된 브랜치를 가르키는 포인터군요!


refs/heads/

더 파보기 위해, refs/heads/를 찍어보았습니다.

child 브랜치와 master 브랜치가 보입니다.
그리고, child 브랜치와 master 브랜치를 찍어보면, 각 각 최신커밋(상단커밋)의 해쉬주소를 담고있습니다.
결국 heads폴더에 담긴것들이 브랜치구나! 임을 알수 있습니다.

결론

아 ! 그러면 깃에서 HEAD는 현재 접속한 브랜치를 포인터로써 가르키는거고,
그 브랜치에서는, 최신커밋에대한 해쉬값을 갖고있는거구나! 그리고, 최신커밋의 해쉬값만 알면, 내부적으로, 부모커밋 탐색을 통해, 해당 브랜치의 과거 커밋들을 탐색할 수 있습니다.

아! 그래서 HEAD->master처럼 뜬거구나..

아마, 첫 포스팅 내용에서 조금 잘못짚은 내용이 있을수도 있습니다.
하지만 수정하지 않고 왜 헷갈렸는지 기록으로 남겨두려고 합니다.
그리고 깃의 HEAD에 대해서 조금씩 다른 뉘앙스로 설명하는 책이 많아서.. 정확히 HEAD가 뭔지 실제로 헷갈렸습니다.

참고
http://sunphiz.me/wp/archives/2266

profile
빨리 가는 유일한 방법은 제대로 가는 것이다

1개의 댓글

comment-user-thumbnail
2023년 12월 13일

옛날 글이라 댓글을 남길까 살짝 고민했지만, 검색을 통해 찾아와 보는 분들을 위해 댓글 남겨봅니다.
지은이분이 작성하신 결론에 HEAD의 뜻을 여전히 잘못 설명하고 있습니다.
HEAD는 현재 접속한 브랜치가 아니라 현재 체크아웃된 커밋을 가리킵니다.

답글 달기