git reset 9033
를 실행하면
이 그림과 같은 결과가 된다고 했습니다. 이렇게 HEAD는 보통 본인이 직접 커밋을 가리키는 게 아니라 브랜치를 통해서 간접적으로 커밋을 가리킵니다.
바로 git checkout 커맨드를 쓰면 됩니다.
원래의 이 상태에서
git checkout 9033
를 실행하면 아래 그림처럼 바뀝니다.
이 그림을 자세히 보세요. 이제 HEAD가 master 브랜치를 가리키는 게 아니라 본인이 직접 9033.. 커밋을 가리키고 있죠?
이렇게 브랜치를 통해서 커밋을 가리키는 게 아니라 본인이 직접 커밋을 가리키고 있는 상태의 HEAD를 특별히 가리키는 말이 있습니다. 바로 Detached HEAD입니다. Detached는 우리말로 ‘~로부터 떨어진, 분리된’이라는 뜻을 갖는데요. 브랜치로부터 떨어진 상태이기 때문에 이렇게 부르는 겁니다.
이렇게 HEAD가 특정 커밋을 직접 가리키게 하는 이유는 여러가지가 있을 수 있는데요.
그 중에서 주된 이유 한 가지는 바로 과거의 특정 커밋에서 새로운 브랜치를 만들고 싶을 때입니다.
예를 들어 지금 위의 그림과 같이 Detached HEAD인 상태에서
git branch premium
으로 premium 브랜치를 새로 만들면 아래 그림과 같은 결과가 됩니다.
그리고 이렇게 HEAD가 premium 브랜치를 가리키는 상태일 때 새 커밋을 하면
이제 premium 브랜치로 master 브랜치와 다른 새로운 코드 관리 흐름을 가져갈 수 있게 되는 겁니다.
방금 한 것처럼 특정 커밋을 시작점으로 하는 새로운 브랜치를 만들고 싶을 때 HEAD를 잠시 Detached HEAD 상태로 두는 경우가 많습니다.
이 내용을 정리하면
git checkout [가고 싶은 브랜치 이름]
형식의 커맨드를 쓴다고 배웠죠?
이제 이 커맨드가 좀 새로운 시각에서 느껴지지 않나요? 자, 그림으로 바로 보여드릴게요.
지금 위 그림과 같은 상태에서
git checkout master
를 실행하면
이렇게 HEAD가 master 브랜치를 가리키게 됩니다. 바로 이게 우리가 이전에 git checkout 커맨드를 사용해서 다른 브랜치로 이동할 때 벌어지는 일이었던 겁니다.
이렇게
git checkout master
이 커맨드의 뜻은 다음과 같이 해석됩니다.
= master 브랜치로 이동하라
= HEAD가 master 브랜치를 가리키도록 하라
= HEAD가 master 브랜치가 가리키던 커밋을 간접적으로 가리키게 됨으로써
= working directory의 내부도 그 커밋에 맞게 변함으로써
= master 브랜치로 이동한 것을 사용자는 실감하게 됨
이렇게 되는 거죠.