Detached HEAD

2023. 6. 26. 10:24Git

detached HEAD는 Git에서 현재 작업 중인 위치가 브랜치가 아닌 커밋 해시를 직접 참조하는 상태를 의미합니다. 즉, HEAD 포인터가 브랜치를 가리키는 것이 아니라, 특정 커밋 객체(해시)를 직접 가리키는 상태입니다. 이 상태는 일시적인 실험이나 특정 시점의 확인에는 유용하지만, 그 상태에서 커밋을 만들면 이력이 브랜치에 저장되지 않기 때문에 주의가 필요합니다.

 

🔍 HEAD란?

먼저 HEAD를 정확히 이해해야 합니다.

HEAD현재 작업 중인 브랜치 또는 커밋을 가리키는 포인터입니다.

일반적으로는 다음과 같은 상태입니다:

HEAD → refs/heads/main → <commit>
  • HEADrefs/heads/main (즉, 브랜치 main)을 가리킵니다.
  • main은 최신 커밋의 해시를 가리킵니다.

 

🎯 Detached HEAD란?

HEAD가 브랜치가 아닌 직접 커밋 해시를 참조하는 상태

예:

HEAD → 9fceb02c3a0db56a786f4e8ebd4eacf1c69c3251

 

즉, 현재 작업 위치가 브랜치가 아니라 특정 커밋에 고정된 상태입니다.

🔹 발생 예시

$ git checkout 9fceb02
  • 9fceb02는 특정 커밋 해시
  • 이 명령어를 실행하면 브랜치가 아닌 해당 커밋으로 이동 → Detached HEAD 상태 진입

 

📌 Detached HEAD 상태에서 작업 시 특징

항목 설명
커밋 가능하지만 브랜치와 연결되지 않음
새 브랜치 만들지 않으면 새 커밋은 고아 상태
상태 유지 브랜치 생성 없이 다른 브랜치로 이동하면 커밋이 사라짐
실험용으로 유용 과거 커밋에서 빌드 테스트 등

 

예시:

$ git checkout 9fceb02         # Detached HEAD 진입
$ echo "test" > file.txt
$ git add file.txt
$ git commit -m "temp commit"  # 브랜치에 속하지 않는 커밋
$ git log --oneline

이후 다른 브랜치로 이동하면 temp commit은 어디에도 속하지 않아 GC(Garbage Collection) 대상이 됩니다.

 

🛟 커밋을 보존하는 방법

$ git switch -c my-experiment
  • 현재 Detached HEAD 상태에서 브랜치 생성
  • HEAD는 이제 my-experiment 브랜치를 가리킴
  • 이전에 만든 커밋이 이 브랜치에 안전하게 포함됨

 

🔥 Detached HEAD 상태 확인

$ git status
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches...

 

 

🎓 요약

항목 HEAD 정상 상태 Detached HEAD 상태
HEAD 값 ref: refs/heads/main 커밋 해시 (9fceb02...)
커밋 저장 브랜치에 저장 저장되지만 브랜치에 속하지 않음
커밋 보존 브랜치가 유지됨 브랜치 없이 유실 가능성
용도 일반적인 개발 실험, 과거 커밋 테스트 등

 

 

🧠 내부적으로 .git/HEAD 상태

정상 상태:

ref: refs/heads/main

 

Detached 상태:

9fceb02c3a0db56a786f4e8ebd4eacf1c69c3251

즉, HEAD 파일이 직접 커밋 해시를 담고 있습니다.

 

 

✅ 결론

  • detached HEAD는 브랜치를 벗어나 특정 커밋에 직접 접근한 상태
  • 커밋을 만들 수는 있지만 브랜치에 연결되지 않음
  • 실험적이거나 과거 상태를 임시로 탐색할 때 유용
  • 새 브랜치로 전환하지 않으면 커밋이 사라질 수 있음

'Git' 카테고리의 다른 글

git checkout  (0) 2023.06.28
git rebase 시, --continue 옵션 사용  (0) 2023.06.28
merge class : index.html  (0) 2023.06.26
ours merge strategy  (0) 2023.06.20
HEAD 포인터  (0) 2023.06.06