Git HEAD란 무엇인가?
Git을 사용하다 보면 HEAD라는 용어를 자주 접하게 됩니다. 특히 git checkout 명령어를 통해 브랜치를 이동하거나 특정 커밋으로 이동할 때 HEAD가 변경되는 것을 볼 수 있습니다.
HEAD는 현재 체크아웃(Checkout)된 커밋을 가리키는 포인터입니다. 쉽게 말해, 현재 작업 트리가 어떤 커밋을 기반으로 하고 있는지를 나타냅니다. 항상 작업 트리의 가장 최근 커밋을 가리키며, 작업 트리에 변화를 주는 Git 명령어들은 대부분 HEAD를 변경하는 것으로 시작합니다.
일반적으로 HEAD는 커밋 ID(해시)를 직접 가리키기보다는, 브랜치의 이름을 가리키고 있습니다.
Git HEAD와 브랜치(Branch)
- 브랜치(Branch): 커밋 사이를 이동할 수 있는 포인터 (예:
master,develop) - HEAD: 현재 내가 위치한 곳을 가리키는 포인터
HEAD가 브랜치를 가리키고 있으면, 새로운 커밋을 생성할 때 브랜치 포인터가 함께 앞으로 이동합니다.
예제로 보는 HEAD의 이동
위 그림에서 HEAD는 master 브랜치를 가리키고 있고, master 브랜치는 C1 커밋을 가리키고 있습니다.
$ git checkout C1
특정 커밋(C1)으로 체크아웃을 하면 HEAD가 브랜치가 아닌 커밋을 직접 가리키게 되는데, 이때 HEAD가 드러난다고 표현하기도 합니다.
$ git checkout master
$ git commit
다시 master 브랜치로 돌아와서 커밋을 진행하면,
master 브랜치와 HEAD가 새로운 커밋을 가리키게 되고, HEAD는 다시 브랜치 뒤에 숨겨집니다.
$ git checkout C2
다시 커밋 C2로 체크아웃을 하면,
HEAD가 master 브랜치에서 분리되어 C2 커밋을 직접 가리키게 됩니다.
Detached HEAD 상태란?
“HEAD를 분리한다(Detached HEAD)”는 것은 HEAD가 브랜치 이름 대신 커밋의 해시값(SHA-1)을 직접 가리키는 현상을 의미합니다.
변경 전
HEAD -> master -> C1 (HEAD가 master 브랜치를 가리키고 있음)
변경 후 (Detached HEAD)
HEAD -> C1 (HEAD가 C1 커밋을 직접 가리키고 있음)
Detached HEAD 상태가 되는 경우
- 특정 커밋 해시로 체크아웃 했을 때 (
git checkout <commit-hash>) - 태그 이름으로 체크아웃 했을 때 (
git checkout v1.0) - 원격 브랜치로 체크아웃 했을 때 (
git checkout origin/master)
이 상태에서 새로운 커밋을 만들면, 어떤 브랜치에도 속하지 않는 고아 커밋이 될 수 있으므로 주의해야 합니다. 작업을 저장하려면 새로운 브랜치를 생성해야 합니다 (git checkout -b new-branch-name).
상대 참조 (Relative Refs)
HEAD를 이동시킬 때 커밋 해시를 매번 입력하는 것은 번거롭습니다. Git에서는 상대 참조를 통해 HEAD를 기준으로 쉽게 이동할 수 있습니다.
HEAD^: HEAD의 부모 커밋 (한 단계 위)HEAD~n: HEAD의 n번째 조상 커밋 (예:HEAD~3은 3단계 위)
참조 사이트
- Learn Git Branching - Git 브랜치 시각화 학습 도구