Detached HEAD
2023. 6. 26. 10:24ㆍGit
detached HEAD
는 Git에서 현재 작업 중인 위치가 브랜치가 아닌 커밋 해시를 직접 참조하는 상태를 의미합니다. 즉, HEAD 포인터가 브랜치를 가리키는 것이 아니라, 특정 커밋 객체(해시)를 직접 가리키는 상태입니다. 이 상태는 일시적인 실험이나 특정 시점의 확인에는 유용하지만, 그 상태에서 커밋을 만들면 이력이 브랜치에 저장되지 않기 때문에 주의가 필요합니다.
🔍 HEAD란?
먼저 HEAD
를 정확히 이해해야 합니다.
HEAD
는 현재 작업 중인 브랜치 또는 커밋을 가리키는 포인터입니다.
일반적으로는 다음과 같은 상태입니다:
HEAD → refs/heads/main → <commit>
HEAD
는refs/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 |