티스토리 뷰

공부일지(TIL)/Others

[Git] Ref

Alledy 2022. 7. 14. 16:16

Ref

커밋을 참조하는 ref에 대해 알아보자.

Hash

커밋을 참조하는 가장 직접적인 방식으로, SHA-1 해시를 통해 참조할 수 있다. 이는 각 커밋의 고유한 id이며, git log 명령을 통해 각 커밋의 해시를 확인할 수 있다.

Refs

커밋을 참조하는 간접적인 방식이다. 커밋 해시에 붙이는 alias 같은 것이라고 생각하면 된다. .git 폴더에 보면 refs라는 폴더가 있다. 그 안에 보면 heads, remotes, tags 등 또 하위 폴더가 존재한다.
heads는 레포의 로컬에 있는 모든 브랜치를 정의하고 있는 폴더이다. heads의 내부를 보면 로컬에 있는 브랜치들이 폴더로 존재하고, 그 안에는 해당 브랜치의 가장 끝에 있는 커밋 해시를 저장하고 있다.

cat .git/refs/heads/main # 로컬 메인 브랜치에 있는 가장 최신 커밋을 보여준다. 

비슷하게 remotes 폴더는 내가 fetch해온 모든 remote 브랜치를 저장하고 있다.
우리가 아주 흔하게 사용하는 git checkout main 이라는 명령어는 사실상 alias를 사용하고 있는 것이다. 로컬 메인 브랜치의 가장 최신 커밋으로 체크아웃한다는 의미이며 정확히는 git checkout refs/heads/main 이라고 해야 정확하다. 보통은 이렇게까지 정확하게 쓰지 않아도 깃이 알아서 resolve해주지만 만약 tag와 branch 모두 동일한 이름을 쓰고 있을 경우에는 이런 식으로 정확히 써주는 것이 필요하다.

refs 폴더 외에도 .git 폴더 내에 특별한 ref들이 존재한다.

  • HEAD: 현재 체크아웃한 커밋/브랜치
  • FETCH_HEAD: 리모트 레포로부터 가장 최근에 fetch된 브랜치
  • ORIG_HEAD: HEAD의 백업 레퍼런스
  • MERGE_HEAD: git merge 명령어를 통해 현재 브랜치에 머지하려고 하는 커밋
  • CHERRY_PICK_HEAD: 체리피킹하고 있는 커밋

예를 들어 git pull이라는 명령을 했을 때, 깃은 먼저 git fetch를 실행하여 FETCH_HEAD 값을 업데이트할 것이고 그 다음 git merge FETCH_HEAD 를 내부적으로 실행할 것이다.

cat .git/HEAD 명령을 했을 때는 커밋 해시 또는 또 다른 symbolic ref가 저장되어있을 수 있다. main에 체크아웃한 상태에서 해당 명령을 치면 ref: refs/heads/main 이 출력된다. 만약 다른 브랜치로 체크아웃하면 또 해당 브랜치를 가리키는 ref로 업데이트된다. 그러나 브랜치가 아닌 커밋으로 체크아웃한 상태라면 HEAD는 그 커밋의 해시를 보여줄 것이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함