Detached HEAD 및 Normal HEAD 로 테스트
이전 단계에서 HEAD가 일반적으로 master와 같은 브랜치를 가리킨다는 것을 배웠습니다. 이것이 "normal" 상태입니다. 그러나 HEAD는 특정 커밋을 직접 가리킬 수도 있습니다. 이를 "detached HEAD" 상태라고 합니다.
detached HEAD가 어떻게 보이는지 살펴보겠습니다. 먼저, 첫 번째 커밋의 커밋 ID 가 필요합니다. git log --oneline을 사용하여 이 ID 를 얻을 수 있습니다.
cd ~/project/my-time-machine
git log --oneline
다음과 유사한 출력을 볼 수 있습니다 (커밋 ID 는 다를 것입니다).
a1b2c3d (HEAD -> master) Send a message to the future
처음 7 개의 문자 (a1b2c3d 예시) 는 짧은 커밋 ID 입니다. 이 ID 를 복사합니다.
이제 git checkout을 사용하여 HEAD가 이 커밋을 직접 가리키도록 이동해 보겠습니다.
git checkout <your_commit_id>
<your_commit_id>를 git log --oneline에서 복사한 실제 짧은 커밋 ID 로 바꿉니다. 예를 들어:
git checkout a1b2c3d
detached HEAD 상태임을 나타내는 출력을 보게 됩니다.
Note: switching to 'a1b2c3d'.
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 by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or, if you want to make this branch stay, use:
git branch <new-branch-name> <your_commit_id>
Switched to commit a1b2c3d
이제 상태를 다시 확인해 보겠습니다.
git status
출력은 detached HEAD 상태임을 명확하게 보여줍니다.
HEAD is now at a1b2c3d Send a message to the future
nothing to commit, working tree clean
그리고 git symbolic-ref HEAD를 사용하면 HEAD가 브랜치에 대한 심볼릭 참조가 아니기 때문에 오류가 표시됩니다.
git symbolic-ref HEAD
이 명령은 오류를 생성하거나 출력이 없어서 HEAD가 심볼릭 참조가 아님을 나타낼 것입니다.
HEAD가 master 브랜치를 가리키는 normal 상태로 돌아가려면 master 브랜치를 checkout 할 수 있습니다.
git checkout master
다음과 같은 출력을 볼 수 있습니다.
Switched to branch 'master'
이제 git status는 다시 master 브랜치에 있음을 보여줍니다.
git status
출력:
On branch master
nothing to commit, working tree clean
그리고 git symbolic-ref HEAD는 다시 심볼릭 참조를 표시합니다.
git symbolic-ref HEAD
출력:
refs/heads/master
(브랜치를 가리키는) attached HEAD와 (커밋을 직접 가리키는) detached HEAD의 차이점을 이해하는 것은 프로젝트 기록을 탐색하고 고급 Git 작업을 수행하는 데 중요합니다.