2023. 6. 6. 22:20ㆍGit
🔍 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 |