Git에서 ‘detached HEAD’ 상태는 개발자들이 처음 마주했을 때 가장 당황스러워하는 개념 중 하나지만, 원리를 알면 매우 유용한 기능입니다.
이 상태를 이해하기 위해 HEAD, 브랜치, 커밋의 관계를 중심으로 자세히 정리해 드리겠습니다.
1. 기본 개념: HEAD란 무엇인가?
-
HEAD는 “현재 내가 보고 있는 작업 공간”을 가리키는 **포인터(화살표)**입니다.
-
정상적인 상태 (Attached):
-
보통 HEAD는 **브랜치(Branch)**를 가리킵니다.
-
그리고 브랜치가 가장 최신 **커밋(Commit)**을 가리킵니다.
-
HEAD → main → Commit ID (a1b2c)
-
이 상태에서는 새 커밋을 하면 main 브랜치도 같이 앞으로 이동합니다.
-
2. ‘Detached HEAD’란?
-
정의: HEAD가 브랜치라는 “이름표”를 거치지 않고, 특정 커밋(Commit ID)을 직접 가리키고 있는 상태입니다.
-
구조:
-
HEAD → Commit ID (a1b2c) (브랜치 없음!)
-
-
의미: “나는 지금 특정 브랜치의 최신 버전을 보는 게 아니라, 과거의 특정 시점(스냅샷)을 뚝 떼어내서 보고 있다”는 뜻입니다.
3. 언제 이 상태가 되나요?
주로 아래와 같은 명령어를 입력했을 때 발생합니다.
-
특정 커밋 해시로 이동했을 때:
-
git checkout a1b2c3d (과거 시점으로 시간 여행)
-
-
태그(Tag)로 이동했을 때:
-
git checkout v1.0 (특정 배포 버전 확인)
-
-
원격 브랜치를 직접 체크아웃했을 때:
-
git checkout origin/main (로컬 브랜치를 만들지 않고 원격 상태만 볼 때)
-
-
상대 참조 사용:
-
git checkout HEAD^ (현재보다 한 단계 전으로 이동)
-
4. 이 상태에서 작업하면 어떻게 되나요? (★중요)
이 상태에서도 파일을 수정하고, git add, git commit을 할 수 있습니다. 하지만 매우 중요한 특징이 있습니다.
-
실험적인 작업 가능:
-
기존 브랜치(main 등)에 전혀 영향을 주지 않고 마음껏 테스트해 볼 수 있습니다. 샌드박스 같은 느낌입니다.
-
-
커밋의 증발 위험:
-
여기서 커밋을 쌓아도, 이 커밋들을 가리키는 “브랜치 이름”이 없습니다.
-
만약 이 상태에서 다른 브랜치(git switch main)로 이동해 버리면, 방금 만든 커밋들은 연결 고리가 끊겨서 **접근할 수 없는 상태(Orphaned)**가 됩니다.
-
(나중에 Git의 가비지 컬렉터가 이 커밋들을 삭제할 수 있습니다.)
-
5. 상황별 대처 방법

상황 A: 그냥 구경만 하러 왔을 때
과거 코드를 확인하거나 빌드만 해보고 싶었던 경우입니다.
-
해결: 볼일이 끝났으면 원래 브랜치로 돌아가면 됩니다.
Bashgit switch main # 또는 git checkout main
상황 B: 여기서 작업한 내용을 저장하고 싶을 때
Detached HEAD 상태에서 이것저것 수정하고 커밋까지 했는데, “어? 이거 괜찮네. 저장하자”라고 생각된 경우입니다.
-
해결: 현재 시점을 기준으로 새 브랜치를 만들어주면 됩니다. (브랜치라는 이름표를 붙여주는 행위)
Bashgit switch -c new-feature-branch # 또는 git checkout -b new-feature-branch이렇게 하면 지금까지 작업한 커밋들이 new-feature-branch에 안전하게 연결됩니다.
상황 C: 실수로 다른 브랜치로 이동해서 커밋을 잃어버렸을 때
Detached HEAD에서 커밋을 했는데, 브랜치 생성 없이 main으로 돌아와 버려서 커밋이 사라진 경우입니다.
-
해결: git reflog를 사용합니다.
-
git reflog 입력 -> 내가 잃어버린 커밋의 해시(예: f8a9b0)를 찾습니다.
-
다시 그 커밋으로 브랜치를 만듭니다.
-
git branch recovered-branch f8a9b0
-
-
요약
| 구분 | Attached HEAD (일반적) | Detached HEAD (분리됨) |
| HEAD가 가리키는 곳 | 브랜치 이름 (예: main) | 커밋 번호 (예: a1b2c) |
| 새 커밋 생성 시 | 브랜치가 따라와서 갱신됨 | 브랜치는 가만히 있고 HEAD만 이동함 |
| 다른 곳으로 이동 시 | 기록이 브랜치에 남아있음 | 브랜치를 안 만들면 기록이 사라짐 |
| 주 사용 목적 | 정상적인 개발 작업 | 과거 시점 조회, 임시 테스트, 버그 원인 파악 |
한 줄 결론:
“Detached HEAD는 이름 없는 임시 작업 공간이다. 작업을 저장하려면 반드시 브랜치 이름(이름표)을 붙여줘야 한다.”