HEAD와 포인터
한 줄 요약
HEAD는 현재 작업 중인 위치(브랜치 또는 커밋)를 가리키는 포인터
개요
Git에서 HEAD는 “지금 내가 어디에서 작업하고 있는가”를 나타냅니다. 보통 현재 브랜치의 최신 Commit을 가리킵니다.
핵심 포인트
- HEAD는 현재 체크아웃된 브랜치(또는 커밋)를 가리킴
- 새 commit을 만들면 HEAD도 함께 이동
- 브랜치를 바꾸면 HEAD도 따라 이동
시각적 이해
기본 상태
HEAD
│
▼
main
│
▼
[c1]───▶[c2]───▶[c3]───▶[c4]
HEAD → main 브랜치 → c4 커밋
새 커밋 후
HEAD
│
▼
main
│
▼
[c1]───▶[c2]───▶[c3]───▶[c4]───▶[c5]
커밋하면 HEAD와 main이 함께 새 커밋으로 이동
브랜치 전환 후
git switch feature main
│
▼
[c1]───▶[c2]───▶[c3]───▶[c4]
│
└───▶[c5]───▶[c6]
▲
│
feature
▲
│
HEAD
HEAD가 feature 브랜치를 가리킴
HEAD 확인하기
# HEAD가 가리키는 곳 확인
cat .git/HEAD
# ref: refs/heads/main
# 현재 브랜치 확인
git branch
# * main ← 현재 브랜치에 * 표시
# HEAD의 커밋 ID 확인
git rev-parse HEAD
# a1b2c3d4e5f6...HEAD의 상대 참조
HEAD를 기준으로 이전 커밋을 참조할 수 있습니다:
| 표현 | 의미 |
|---|---|
HEAD | 현재 커밋 |
HEAD~1 또는 HEAD~ | 1단계 이전 커밋 |
HEAD~2 | 2단계 이전 커밋 |
HEAD~n | n단계 이전 커밋 |
[c1]───▶[c2]───▶[c3]───▶[c4]
│ │ │ │
HEAD~3 HEAD~2 HEAD~1 HEAD
활용 예시
# 직전 커밋과 비교
git diff HEAD~1
# 2단계 이전 커밋 보기
git show HEAD~2
# 최근 3개 커밋 보기
git log HEAD~3..HEADDetached HEAD 상태
특정 커밋을 직접 체크아웃하면 Detached HEAD 상태가 됩니다:
git checkout a1b2c3d main
│
▼
[c1]───▶[c2]───▶[c3]───▶[c4]
▲
│
HEAD (detached)
주의
Detached HEAD 상태에서 커밋하면 브랜치에 연결되지 않습니다. 나중에 다른 브랜치로 이동하면 해당 커밋을 잃어버릴 수 있습니다.
Detached HEAD에서 돌아오기
# 원래 브랜치로 돌아가기
git switch main
# 또는 새 브랜치 만들기 (현재 위치 유지하고 싶을 때)
git switch -c new-branchHEAD 관련 명령어
| 명령어 | 설명 |
|---|---|
git log | HEAD부터 히스토리 보기 |
git reset HEAD~1 | HEAD를 이전으로 이동 |
git checkout HEAD~1 | 이전 커밋 확인 (detached) |
git switch - | 이전에 있던 브랜치로 돌아가기 |
자주 하는 실수
”You are in ‘detached HEAD’ state” 경고
원인: 브랜치가 아닌 특정 커밋을 체크아웃함
해결:
# 브랜치로 돌아가기
git switch main
# 현재 위치에서 새 브랜치 만들기
git switch -c new-branch-nameHEAD~와 HEAD^의 차이
일반적인 경우 둘은 같지만, merge 커밋에서 다릅니다:
HEAD~: 첫 번째 부모 방향으로 이동HEAD^: 첫 번째 부모HEAD^2: 두 번째 부모 (merge된 브랜치)
간단하게
대부분의 경우
HEAD~만 사용해도 충분합니다.
관련 명령어
- git log - 커밋 히스토리 확인
- git checkout과 switch - 브랜치 이동
- git reset - HEAD 이동 및 되돌리기