git HEAD에 대해 알아봅시다.

GIT 2022. 10. 12. 23:26

 현재 배포되어 있는 상태가 어떤 것인지 알려주세요. 충분히 나올 법한 질문입니다. 메모를 안 해 두었다면. 그래서 간단하게 실습해 보면서 알아보겠습니다. 혹여나 부족한 것이 있으면 댓글로 알려주시면 감사하겠습니다.

 


 먼저, 저는 test1 브랜치에 들어와 있습니다. test1의 commit log인데요. merge라는 메세지를 가진 것이 최근의 것임을 ㅇ랄 수 있습니다. 그 전의 커밋은 modify 1.txt append 4, 5, 6, 7이였음을 알 수 있습니다.

 

 

 test1의 가장 최근 커밋은 7e89f73c입니다. 1개 전 커밋을 보겠습니다.

 

 

 1개 전의 것은 41177fd5입니다. 그리고 이 커밋에서 4, 5, 6, 7이 추가되었는데요.

 

 

 이 때 1.txt에는 1, 2, 3, 4, 5, 6, 7이 적혀져 있습니다. 여기까지 상황을 정리해 봅시다. 브랜치 test1의 최근 커밋은 7e89..이고, 이전 것은 4117..입니다. 여기까지 상황 정리되셨나요?

 


 이제 HEAD가 어디를 가리키고 있는지 보겠습니다. .git 폴더 아래에 HEAD가 있습니다. 이 부분을 보겠습니다. refs/heads/test1이라고 되어 있는데요. .git/refs/heads/test1을 출력해 보면 7e89f... 가 나옴을 볼 수 있습니다. 즉, 현재 로컬 상태는 7e89.. 인 셈입니다.

 

 

 이제, HEAD를 1개 전 커밋으로 이동해 보겠습니다. git checkout HEAD~1입니다. 그러면, "detached HEAD" state 상태에 있다는 메세지가 뜹니다.

 

 

 그리고 나서 1.txt를 보니, 1, 2, 3, 4, 5, 6, 7이 있습니다. 제 로컬에 어떤 상태가 반영되고 있나요?

 

 

 다시 git 상태를 보면, 중간에 떨어져 나온 노란색의 무언가가 보이는데요. 이것이 modify 1.txt append 4, 5, 6, 7 커밋을 가리키고 있습니다. 이 commit의 상태가 반영되어 있는 것입니다. 다시, .git/HEAD와 .git/refs/heads/test1을 보겠습니다.

 

 

 .git/HEAD를 보면 41177fd... 를 가리키고 있는데요. 이것은 test1의 최신 커밋의 이전 커밋입니다. 4117... 후의 커밋이 7e89... 였다는 것은 위에서 언급을 했었습니다. 즉, .git/HEAD는 현재 로컬에 반영되어 있는 상태와 관련이 깊다. 정도로 생각하는 것은 나름 합리적인 추론입니다. 그리고, HEAD는 작업 공간에 적용되어 있는 상태와 관련이 깊습니다.

 

 


 이제 HEAD가 test1의 최신 커밋을 가리키게 해 봅시다. 이는 어렵지 않습니다. test1 브랜치를 checkout 해 주면 됩니다.

 

 git checkout test1을 입력해 보겠습니다.

 

 

 그러면 1.txt에 1, 2, 3, 8, 4, 5, 6, 7이 있음을 알 수 있는데요. 이는 test1의 최신 커밋 상태입니다.

 

 

 HEAD도 test1의 최신 커밋인 merge를 가리키고 있음을 볼 수 있습니다. 그래서, .git/HEAD를 보면 반영되어 있는 상태를 볼 수 있겠다. 정도만 정리하셔도 무난하겠네요.