Git을 쓰다 보면 자주 보게 되는 개념이 있다.
처음에는 각각 따로 외워야 할 것처럼 보이지만,
사실은 “포인터가 어디를 가리키고 있느냐” 하나로 연결된 개념이다.
브랜치는 커밋을 가리키는 포인터다.
즉, 브랜치는 “이 커밋을 기준으로 작업 중이다”라는 표시다.
A --- B --- C (main)
이 상태에서 새로운 커밋을 만들면:
A --- B --- C --- D (main)
main 브랜치는 자동으로 D로 이동한다.
브랜치는 “고정된 개념”이 아니라 계속 움직이는 포인터다.
HEAD는 “현재 내가 보고 있는 위치”를 가리키는 포인터다.
대부분의 경우 HEAD는 브랜치를 가리킨다.
HEAD -> main -> C
의미를 풀면:
중요한 포인트는 이것이다.
즉,
HEAD → 브랜치 → 커밋
이 구조로 이어진다.
git reset은 브랜치가 가리키는 커밋 위치를 옮기는 명령이다.
즉,
A --- B --- C (main)
^
HEAD
A --- B (main)
^
HEAD
C 커밋이 “사라진 것처럼” 보이지만,
정확히 말하면 main 브랜치가 B로 이동한 것이다.
HEAD는 항상 “현재 체크아웃된 브랜치”를 따라간다.
그래서 reset 결과를 보면
“HEAD가 이동한 것처럼” 느껴지는 것이다.
많이 헷갈리는 부분이라 같이 정리해본다.
HEAD -> C
main -> D
이 상태를 Detached HEAD 상태라고 부른다.
이 상태에서 커밋을 만들면
브랜치에 연결되지 않은 “떠 있는 커밋”이 되기 때문에 주의가 필요하다.
이 구조를 이해하면 다음이 명확해진다.
Git은 결국
“포인터를 어디로 옮기느냐”의 문제다.
| 개념 | 역할 |
|---|---|
| 커밋 | 작업 스냅샷 |
| 브랜치 | 특정 커밋을 가리키는 포인터 |
| HEAD | 현재 사용 중인 브랜치를 가리키는 포인터 |
| git reset | 브랜치 포인터를 과거로 이동 |
| git checkout | HEAD를 다른 위치로 이동 |