Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git HEAD and Refs

Git HEAD and Refs

Git의 여러 명령어로 Refs 가 변화하는 것을 통해 HEAD 와 Branch 시스템 내부를 간단히 소개했습니다.
유니크굿컴퍼니에서 2022년 6월 8일에 진행한 Git 세미나 진행 슬라이드입니다.

Muhun Kim

June 08, 2022
Tweet

More Decks by Muhun Kim

Other Decks in Programming

Transcript

  1. HEAD와 refs 1 Refs 를 통해 HEAD 와 Branch 시스템

    내부를 간단히 알아보자 COPYRIGHT 2022. 김무훈
  2. HEAD 의 역할 2 Git 은 어떻게 현재 브랜치를 알

    수 있을까요? HEAD 라는 특수 포인터를 유지하는 덕에 알 수 있습니다. 중략 Git에서 이것은 현재 있는 로컬 브 랜치에 대한 포인터입니다. — Git - Branches in a Nutshell
  3. HEAD 의 역할 2 Git 은 어떻게 현재 브랜치를 알

    수 있을까요? HEAD 라는 특수 포인터를 유지하는 덕에 알 수 있습니다. 중략 Git에서 이것은 현재 있는 로컬 브 랜치에 대한 포인터입니다. — Git - Branches in a Nutshell Git 은 어떻게 현재 브랜치를 알 수 있을까요? HEAD 라는 특수 포인터를 유지하는 덕에 알 수 있습니다. 중략 Git에서 이것은 현재 있는 로컬 브 랜치에 대한 포인터입니다. — Git - Branches in a Nutshell HEAD -> pages/detail index, origin/HEAD
  4. git log git log HEAD 여러분이 잘 아시는 git log

    는 git log HEAD 의 별칭입니다. git log commit id : 어떤 commit id 이전의 이력 Refs 가 바로 commit id 을 알기 쉬운 이름으로 저장해두는 것 입니다. 저장된 자료는 .git/refs 경로에 있습니다. 3 .git/refs
  5. HEAD와 origin/HEAD 4 두가지 의미 1. 현재 브랜치의 Refs를 간접적으로

    알려준다. 2. 현재 checkout 된 commit id 를 가리키는 Ref 리모트 저장소도 HEAD가 있습니다. • origin/HEAD : origin 의 최근 브랜치에서 서버와 마 지막으로 교환한 커밋 refs/heads/master
  6. HEAD와 orgin/HEAD 5 두가지 의미 1. 현재 브랜치의 Refs를 간접적으로

    알려준다. 2. 현재 checkout 된 commit id 를 가리키는 Ref 리모트 저장소도 HEAD가 있습니다. • origin/HEAD : origin 의 최근 브랜치에서 서버와 마 지막으로 교환한 커밋
  7. HEAD와 orgin/HEAD 6 두가지 의미 1. 현재 브랜치의 Refs를 간접적으로

    알려준다. 2. 현재 checkout 된 commit id 를 가리키는 Ref 리모트 저장소도 HEAD가 있습니다. • origin/HEAD : origin 의 최근 브랜치에서 서버와 마 지막으로 교환한 커밋 HEAD 는 ref 를 가리키거나 
 특정 커밋으로 checkout 이후에는 커밋을 직접 가리키고 있습니다. 리모트 저장소도 HEAD를 갖고 있습니다.
  8. Refs 심화 - Refs 직접 수정하기 7 특정 브랜치의 HEAD

    수정하기, 새 브랜치를 특정 브랜치 의 사본으로 만들기 • echo commit id .git/refs/heads/main • 또는 git update ref refs/heads/main commit id git reset 커멘드 내부적으로 git update ref 가 쓰이고 있습니다. ./git/refs/heads 경로 내부에는 브랜치 이름이 담긴 ref 파일이나 서브 브랜치 폴더가 있습니다. https://git scm.com/book/en/v2/Git Internals Git References
  9. Refs 심화 - 간접 Refs 수정하기 8 오른쪽 도식에서 HEAD는

    현재 브랜치를 가리키는 간접 symbolic Refs입니다. 직접 수정해볼까요? • echo .git/refs/heads/main ./git/HEAD • 또는 git symbolic ref HEAD refs/heads/main git switch, checkout 커멘드 내부적으로 git symbolic ref 가 쓰입니다. https://git scm.com/book/en/v2/Git Internals Git References
  10. TIP : commit id 와 commit id 차이 9 캐럿

    과 틸드 모두 부모 커밋을 가리킨다는 점에서 그 의미는 동일하지만 2개 이 상 쓸 경우가 다릅니다. • 캐럿의 경우 n번째 부모를 뜻함 • 틸드의 경우 n번째 상위 부모를 뜻함 머지를 하면서 부모 커밋이 여러개 생길 수 있는데요. 이 차이를 확실히 알아두면 머 지 커밋이 담긴 로그를 다룰 때에 유용히 사용할 수 있다고 합니다. Stackoverflow 답변 참고
  11. 실습 10 • 이전 커밋으로 초기화를 HEAD와 캐럿 문자를 활용해서

    해보자 • 현재 브랜치를 직접 .git/HEAD를 수정해서 전환해보고, 특정 브랜치의 최신 이력 을 .git/refs/* 를 직접 수정해서 변경해보자 update ref, symbolic ref 실습 포함 • 심화 실습 : 깃은 앞서 소개한 쉘 명령어 외에도 update index 등 여러 작은 쉘 스크 립트의 조합으로 운영되는 시스템입니다. 내부를 직접 살펴보면 어떨까요? * 제가 작성한 레포트 Git 사용 시나리오 보고서 참고