Git HEAD란? Detached HEAD 원인과 복구 방법

Git HEAD는 현재 작업 위치를 가리키는 포인터로, 보통 브랜치를 거쳐 커밋을 가리킨다. 커밋을 직접 가리키게 되는 Detached HEAD 상태의 원인과 복구 방법을 정리한다.

Git

개요

  1. Git은 수많은 커밋이 체인처럼 이어진 히스토리를 관리한다.

  2. 이 중에서 "지금 내가 보고 있는 커밋이 어디인가"를 Git이 항상 알아야 한다.

  3. 그 위치를 가리키는 포인터가 바로 HEAD다.

  4. HEAD는 현재 작업 위치를 가리키는 특수한 포인터로, 브랜치 이동·커밋·되돌리기 등 모든 Git 작업의 기준점이 된다.

  5. 실제로는 .git/HEAD라는 파일 하나로 존재한다.

  6. 이 파일을 열어보면 아래처럼 브랜치 이름을 참조하고 있다.

    ref: refs/heads/main
  7. 즉 HEAD는 브랜치를 가리키고, 브랜치는 커밋을 가리키는 이중 참조 구조다.

  8. 아래처럼 커밋이 쌓일수록 브랜치 포인터가 앞으로 이동하고, HEAD는 브랜치를 따라간다.

    				HEAD
    				 ↓
    				main
    				 ↓
    ●──●──●──●
             ↑
          최신 커밋

커밋할 때 HEAD가 움직이는 방식

  1. 새 커밋을 만들면 현재 브랜치 포인터가 새 커밋으로 이동한다.

  2. HEAD는 브랜치를 따라가기 때문에 자동으로 최신 커밋을 가리키게 된다.

    		커밋 전            커밋 후
    
    		HEAD              HEAD
    			↓                 ↓
    		main              main
    			↓                 ↓
    ●──●──●    →   ●──●──●──● (새 커밋)
  3. 새 커밋을 만들면 현재 브랜치 포인터가 새 커밋으로 이동한다.

  4. HEAD는 브랜치를 따라가기 때문에 자동으로 최신 커밋을 가리키게 된다.

Detached HEAD

  1. 브랜치가 아닌 커밋을 직접 체크아웃하면 HEAD가 브랜치가 아닌 커밋을 직접 가리키게 된다.

  2. 이 상태를 Detached HEAD라고 부른다.

    git checkout abc1234   # 특정 커밋 해시로 이동
    		HEAD
          ↓
    ●──●──●──●
    	       ↑
    	      main
    • main 브랜치는 여전히 최신 커밋을 가리키고 있지만, HEAD는 브랜치에서 떨어져 나와 abc1234 커밋을 직접 가리킨다.
  3. 이 상태에서 커밋을 하면 어떤 브랜치에도 속하지 않는 커밋이 생긴다.

  4. 이후 다른 브랜치로 이동하면 그 커밋은 브랜치가 없어 Git이 나중에 삭제할 수 있다.

  5. Detached HEAD 상태에서 작업을 보존하려면 즉시 새 브랜치를 만들어야 한다

    git switch -c my-recovery-branch

댓글