개요
-
Git은 수많은 커밋이 체인처럼 이어진 히스토리를 관리한다.
-
이 중에서 "지금 내가 보고 있는 커밋이 어디인가"를 Git이 항상 알아야 한다.
-
그 위치를 가리키는 포인터가 바로 HEAD다.
-
HEAD는 현재 작업 위치를 가리키는 특수한 포인터다.
-
실제로는
.git/HEAD라는 파일 하나로 존재한다. -
이 파일을 열어보면 아래처럼 브랜치 이름을 참조하고 있다.
ref: refs/heads/main -
즉 HEAD는 브랜치를 가리키고, 브랜치는 커밋을 가리키는 이중 참조 구조다.
-
아래처럼 커밋이 쌓일수록 브랜치 포인터가 앞으로 이동하고, HEAD는 브랜치를 따라간다.
HEAD ↓ main ↓ ●──●──●──● ↑ 최신 커밋
커밋할 때 HEAD가 움직이는 방식
-
새 커밋을 만들면 현재 브랜치 포인터가 새 커밋으로 이동한다.
-
HEAD는 브랜치를 따라가기 때문에 자동으로 최신 커밋을 가리키게 된다.
커밋 전 커밋 후 HEAD HEAD ↓ ↓ main main ↓ ↓ ●──●──● → ●──●──●──● (새 커밋) -
새 커밋을 만들면 현재 브랜치 포인터가 새 커밋으로 이동한다.
-
HEAD는 브랜치를 따라가기 때문에 자동으로 최신 커밋을 가리키게 된다.
Detached HEAD
-
브랜치가 아닌 커밋을 직접 체크아웃하면 HEAD가 브랜치가 아닌 커밋을 직접 가리키게 된다.
-
이 상태를 Detached HEAD라고 부른다.
git checkout abc1234 # 특정 커밋 해시로 이동HEAD ↓ ●──●──●──● ↑ mainmain브랜치는 여전히 최신 커밋을 가리키고 있지만,HEAD는 브랜치에서 떨어져 나와abc1234커밋을 직접 가리킨다.
-
이 상태에서 커밋을 하면 어떤 브랜치에도 속하지 않는 커밋이 생긴다.
-
이후 다른 브랜치로 이동하면 그 커밋은 브랜치가 없어 Git이 나중에 삭제할 수 있다.
-
Detached HEAD 상태에서 작업을 보존하려면 즉시 새 브랜치를 만들어야 한다
git switch -c my-recovery-branch