git에는 rev-parse라는 명령어가 있습니다. 이 명령어로 현재 커밋의 hash라던지, 특정 커밋의 hash 등을 얻어올 수 있습니다. 예를 들자면, 현재 브랜치의 커밋에서 5개 전에 있는 commit의 hash라던지, 다른 branch의 head에서 5개 전의 커밋 hash 등도 얻어올 수 있습니다. 상대 참조의 개념을 이용하면 이런 것들은 어렵지 않게 할 수 있습니다. 이건 보너스로 실습하면서 알아봅시다.

 


 git graph는 위와 같습니다. 현재 브랜치의 head의 커밋 hash을 얻어오고 싶습니다.

 

 그러면 단순히 git rev-parse HEAD 이렇게 입력해 주시면 됩니다. 현재 제 커밋은 cef083c.. 임을 볼 수 있어요.

 

 해당 커밋에서, main.txt가 최초로 추가되었습니다. 현재 제 작업 디렉토리에 main.txt가 있음을 봐야 겠네요.

 

 있으니까 문제가 없네요.

 


 제가 많이 하는 git reset HEAD^에서 HEAD^는 어떤 커밋을 의미할까요? git rev-parse HEAD^를 입력해 보겠습니다. 그러면, 6abb가 나오게 됩니다.

 

 Merge branch 'test3'이 있었고, 해당 커밋 다음이 cef08.. 입니다. cef08..은 현재 HEAD가 가리키고 있는 커밋이니, 이전 커밋임을 알 수 있습니다. git graph로도 알 수 있는 사실이지만, cef08..의 부모 커밋은 6abb4.. 입니다.

 

 

 cef0 입장에서 보면 1번째 부모는 6abb인 셈입니다.

 

 그런데, git rev-parse HEAD^2를 하면 어떤가요? 이는 HEAD의 2번째 부모를 의미합니다. 그림으로 그리면 어떤 상황인가? 이런 상황입니다.

 

 빨간 점선을 따라가게 되는데, 커밋이 없는 상황입니다. unknown이니 에러를 뱉겠군요.

 

 이제 git rev-parse HEAD~2를 입력해 보겠습니다.

 

 HEAD~2는 현재 HEAD로부터 부모의 부모 커밋을 의미합니다. 그런데 깃 그래프를 보겠습니다.

 

 HEAD로부터 1개 전 커밋이 6abb..인데, 2개 전 커밋은 b6c..가 될 수도 있고, 15a5..가 될 수 있는 상황입니다. 그림으로 그리면 이런 상황입니다.

 

 

 6abb..의 first parent는 어느 쪽일까요? git log 6abb.. --first-parent로 1번째 parent만 찾아보겠습니다.

 

 

 b6c6.. 이네요. 이는 git log 명령어에 --first-parent 옵션을 주면 알 수 있습니다.