HEAD 포인터

2023. 6. 6. 22:20Git

🔍 Git의 HEAD 완전 정복: 내부 구조와 참조 흐름까지

Git을 다루는 개발자라면 반드시 마주치게 되는 개념, HEAD.
대부분의 경우 단순히 "현재 작업 중인 브랜치를 가리킨다"고 이해하지만, Git 내부적으로는 어떻게 동작할까요?
이번 글에서는 .git/HEAD 파일의 내부 구조, 정상 상태와 Detached 상태의 차이, 그리고 HEAD가 커밋을 가리키는 전체 참조 흐름까지 정리해 보겠습니다.

 

🧠 HEAD란 무엇인가?

HEAD는 Git에서 현재 체크아웃된 브랜치 또는 커밋을 가리키는 참조(Reference)입니다.

대부분의 경우 HEAD는 현재 작업 중인 브랜치를 가리킵니다. 그러나 특정 커밋으로 직접 이동하면, 브랜치를 가리키지 않고 Detached HEAD 상태가 됩니다.

 

🧭 HEAD의 기본 동작 구조

정상적으로 브랜치 상태일 때, HEAD는 다음과 같은 참조 흐름을 가집니다:

HEAD → refs/heads/main → <커밋 해시>

즉, HEAD는 refs/heads/main이라는 브랜치 파일을 참조하고, 이 파일은 실제 커밋 해시값을 담고 있습니다.

 

🧩 .git/HEAD 파일의 내부 구조

✅ 브랜치 상태 (정상적인 HEAD)

$ cat .git/HEAD
ref: refs/heads/main
  • HEAD브랜치 참조 파일(refs/heads/main)을 가리킵니다.
  • refs/heads/main 파일 안에는 브랜치의 최신 커밋 해시가 들어 있습니다.
$ cat .git/refs/heads/main
f5d3b891b91d3920fa7c1c1a7d0c5947633e67b2

 

📂 디렉토리 구조 예시

.git/
├── HEAD                     ← 현재 브랜치 포인터
├── refs/
│   └── heads/
│       └── main             ← 커밋 해시를 저장하는 브랜치 참조

 

✅ Detached HEAD 상태

$ git checkout 3a2f9cd
$ cat .git/HEAD
3a2f9cd2764a8a4a61cb87c6a257dfb5a501c627
  • 이 상태에서 HEAD는 브랜치가 아닌 특정 커밋을 직접 가리키는 SHA 해시값을 저장합니다.
  • 브랜치에 연결되어 있지 않기 때문에, 커밋을 해도 브랜치로 연결되지 않습니다.

만약 브랜치를 새로 만들지 않고 다른 브랜치로 checkout 하면 이 커밋은 "고아 커밋"이 되어 잃어버릴 수 있습니다.

 

🔁 참조 흐름 요약

상태 .git/HEAD 내용 의미
브랜치 상태 ref: refs/heads/main HEAD → 브랜치 참조 → 커밋 해시
Detached 상태 3a2f9cd2764a... HEAD → 커밋 해시 직접 참조

 

🛠️ HEAD 관련 명령어 정리

HEAD가 어떤 브랜치를 가리키는지 확인

git symbolic-ref HEAD
# 출력: refs/heads/main

 

HEAD가 가리키는 커밋 해시 출력

git rev-parse HEAD
# 출력: f5d3b891b91d39...

 

HEAD의 부모 커밋 확인

git rev-parse HEAD^
git rev-parse HEAD~1

 

🧪 실습 예제

git checkout main
cat .git/HEAD
# ref: refs/heads/main

git checkout 3a2f9cd
cat .git/HEAD
# 3a2f9cd2764a8a...

 

🧭 시각화된 참조 구조

✅ 브랜치 상태

.git/HEAD
  └── ref: refs/heads/main
        └── f5d3b891... (커밋 해시)

 

✅ Detached HEAD 상태

.git/HEAD
  └── f5d3b891... (커밋 해시 직접 저장)

 

🧷 체크 포인트

개념 설명
HEAD 현재 체크아웃된 브랜치 또는 커밋을 가리키는 Git의 핵심 포인터
ref: 접두사 .git/HEAD가 다른 참조 파일을 참조 중일 때 사용
Detached HEAD 특정 커밋 해시를 직접 참조하는 상태
.git/refs/heads/* 브랜치별 커밋 해시가 저장되는 참조 파일
git symbolic-ref HEAD HEAD가 브랜치를 참조하는 경우 경로를 출력
git rev-parse HEAD HEAD가 가리키는 정확한 커밋 해시 출력

 

📌 마치며

Git의 HEAD는 단순한 커밋 포인터를 넘어, Git의 참조(ref) 시스템의 핵심 축입니다.
이 구조를 이해하면 reset, checkout, rebase, merge 같은 고급 명령의 동작 원리도 쉽게 이해할 수 있습니다.

다음 글에서는 .git/logs/HEAD, reflog, 그리고 packed-refs까지 확장해 Git 내부의 모든 참조 흐름을 완전히 해부해보겠습니다.

'Git' 카테고리의 다른 글

git checkout  (0) 2023.06.28
git rebase 시, --continue 옵션 사용  (0) 2023.06.28
merge class : index.html  (0) 2023.06.26
Detached HEAD  (0) 2023.06.26
ours merge strategy  (0) 2023.06.20