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~22단계 이전 커밋
HEAD~nn단계 이전 커밋
[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..HEAD

Detached HEAD 상태

특정 커밋을 직접 체크아웃하면 Detached HEAD 상태가 됩니다:

git checkout a1b2c3d
                      main
                        │
                        ▼
[c1]───▶[c2]───▶[c3]───▶[c4]
          ▲
          │
        HEAD (detached)

주의

Detached HEAD 상태에서 커밋하면 브랜치에 연결되지 않습니다. 나중에 다른 브랜치로 이동하면 해당 커밋을 잃어버릴 수 있습니다.

Detached HEAD에서 돌아오기

# 원래 브랜치로 돌아가기
git switch main
 
# 또는 새 브랜치 만들기 (현재 위치 유지하고 싶을 때)
git switch -c new-branch

HEAD 관련 명령어

명령어설명
git logHEAD부터 히스토리 보기
git reset HEAD~1HEAD를 이전으로 이동
git checkout HEAD~1이전 커밋 확인 (detached)
git switch -이전에 있던 브랜치로 돌아가기

자주 하는 실수

”You are in ‘detached HEAD’ state” 경고

원인: 브랜치가 아닌 특정 커밋을 체크아웃함

해결:

# 브랜치로 돌아가기
git switch main
 
# 현재 위치에서 새 브랜치 만들기
git switch -c new-branch-name

HEAD~와 HEAD^의 차이

일반적인 경우 둘은 같지만, merge 커밋에서 다릅니다:

  • HEAD~: 첫 번째 부모 방향으로 이동
  • HEAD^: 첫 번째 부모
  • HEAD^2: 두 번째 부모 (merge된 브랜치)

간단하게

대부분의 경우 HEAD~만 사용해도 충분합니다.

관련 명령어

더 알아보기