Chapters ā–¾ 2nd Edition

10.3 Gitģ˜ ė‚“ė¶€ - Git Refs

Git Refs

ģ–“ė–¤ 커밋 1a410e ģ“ģ „ģ˜ ėŖØė“  ķžˆģŠ¤ķ† ė¦¬ė„¼ 볓려멓 git log 1a410e ė¼ź³  ģ‹¤ķ–‰ķ•˜ė©“ ķžˆģŠ¤ķ† ė¦¬ė„¼ ė³¼ 수 ģžˆģ§€ė§Œ, ģ—¬ģ „ķžˆ 1a410e 넼 기억핓야 ķ•œė‹¤. ģ“ ģ»¤ė°‹ģ€ ė§ˆģ§€ė§‰ ģ»¤ė°‹ģ“źø° ė•Œė¬øģ— ķžˆģŠ¤ķ† ė¦¬ė„¼ ė”°ė¼ ėŖØė“  개첓넼 ģ”°ķšŒķ•  수 ģžˆė‹¤. SHA-1 ź°’ģ„ ė‚ ė”œ ģ‚¬ģš©ķ•˜źø°ė³“ė‹¤ ģ‰¬ģš“ ģ“ė¦„ģœ¼ė”œ 된 ķ¬ģøķ„°ź°€ ģžˆģœ¼ė©“ ź·øź±ø ģ‚¬ģš©ķ•˜ėŠ” 게 ė” 좋다. ģ™øģš°źø° ģ‰¬ģš“ ģ“ė¦„ģœ¼ė”œ 된 ķŒŒģ¼ģ— SHA-1 ź°’ģ„ ģ €ģž„ķ•œė‹¤.

Gitģ—ģ„œėŠ” ģ“ėŸ° ź²ƒģ„ ā€œReferencesā€ ė˜ėŠ” ā€œRefsā€ ė¼ź³  부넸다. ģ“ SHA-1 ź°’ģ„ ģ €ģž„ķ•˜ėŠ” ķŒŒģ¼ģ€ .git/refs 디렉토리에 ģžˆė‹¤. ģ˜ˆģ œģ˜ ķ”„ė”œģ ķŠøģ—ėŠ” 아직 .git/refs 디렉토리 ģ•ˆģ— ķŒŒģ¼ģ€ 없고 ė””ė ‰ķ† ė¦¬ė§Œ ėŖ‡ 개 ģžˆė‹¤.

$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/tags
$ find .git/refs -type f

Refsź°€ ģžˆģœ¼ė©“ ģ»¤ė°‹ģ„ 찾기 ģ‰¬ģ›Œģ§„ė‹¤. 사실 ė‚“ė¶€ėŠ” ģ•„ėž˜ģ²˜ėŸ¼ ė‹Øģˆœķ•˜ė‹¤.

$ echo 1a410efbd13591db07496601ebc7a059dd55cfe9 > .git/refs/heads/master

SHA-1 ź°’ ėŒ€ģ‹ ģ— ģ§€źøˆ ė§Œė“  Refs넼 ģ‚¬ģš©ķ•  수 ģžˆė‹¤.

$ git log --pretty=oneline master
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit

Refs ķŒŒģ¼ģ„ 직접 ź³ ģ¹˜ėŠ” ź²ƒģ“ 좀 ėŖ»ė§ˆė•…ķ•˜ė‹¤. Gitģ—ėŠ” 좀 ė” ģ•ˆģ „ķ•˜ź²Œ 바꿀 수 ģžˆėŠ” git update-ref ėŖ…ė ¹ģ“ ģžˆė‹¤.

$ git update-ref refs/heads/master 1a410efbd13591db07496601ebc7a059dd55cfe9

Git ėøŒėžœģ¹˜ģ˜ ģ—­ķ• ģ“ ė°”ė”œ ģ“ź±°ė‹¤. ėøŒėžœģ¹˜ėŠ” ģ–“ė–¤ ģž‘ģ—… 중 ė§ˆģ§€ė§‰ ģž‘ģ—…ģ„ ź°€ė¦¬ķ‚¤ėŠ” ķ¬ģøķ„° ė˜ėŠ” Refsģ“ė‹¤. ź°„ė‹Øķžˆ 두 번째 ģ»¤ė°‹ģ„ ź°€ė¦¬ķ‚¤ėŠ” ėøŒėžœģ¹˜ė„¼ ė§Œė“¤ģ–“ ė³“ģž.

$ git update-ref refs/heads/test cac0ca

ėøŒėžœģ¹˜ėŠ” 직접 ź°€ė¦¬ķ‚¤ėŠ” 커밋과 ź·ø ģ»¤ė°‹ģœ¼ė”œ ė”°ė¼ź°ˆ 수 ģžˆėŠ” ėŖØė“  ģ»¤ė°‹ģ„ ķ¬ķ•Øķ•œė‹¤.

$ git log --pretty=oneline test
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit

ģ“ģ œ Git ė°ģ“ķ„°ė² ģ“ģŠ¤ėŠ” ģ•„ėž˜ 그림처럼 ė³“ģøė‹¤.

ėøŒėžœģ¹˜ Refsź°€ ģ¶”ź°€ėœ Git ė°ģ“ķ„°ė² ģ“ģŠ¤.
그림 151. ėøŒėžœģ¹˜ Refsź°€ ģ¶”ź°€ėœ Git ė°ģ“ķ„°ė² ģ“ģŠ¤.

git branch <branch> ėŖ…ė ¹ģ„ ģ‹¤ķ–‰ķ•˜ė©“ Gitģ€ ė‚“ė¶€ģ ģœ¼ė”œ update-ref ėŖ…ė ¹ģ„ ģ‹¤ķ–‰ķ•œė‹¤. ģž…ė „ė°›ģ€ ėøŒėžœģ¹˜ ģ“ė¦„ź³¼ ķ˜„ ėøŒėžœģ¹˜ģ˜ ė§ˆģ§€ė§‰ ģ»¤ė°‹ģ˜ SHA-1 ź°’ģ„ 가져다 update-ref ėŖ…ė ¹ģ„ ģ‹¤ķ–‰ķ•œė‹¤.

HEAD

git branch <branch> ėŖ…ė ¹ģ„ 실행할 ė•Œ Gitģ€ ģ–“ė–»ź²Œ ė§ˆģ§€ė§‰ ģ»¤ė°‹ģ˜ SHA-1 ź°’ģ„ ģ•„ėŠ” 걸까? HEAD ķŒŒģ¼ģ€ ķ˜„ ėøŒėžœģ¹˜ė„¼ ź°€ė¦¬ķ‚¤ėŠ” ź°„ģ ‘(symbolic) Refs다.

ź°„ģ ‘ Refsė¼ģ„œ 다넸 것과 다넓다. ģ“ RefsėŠ” 다넸 Refs넼 ź°€ė¦¬ķ‚¤ėŠ” ź²ƒģ“ė¼ģ„œ SHA-1 ź°’ģ“ 없다. ķŒŒģ¼ģ„ ģ—“ģ–“ 볓멓 ģ•„ėž˜ģ™€ ź°™ģ“ ģƒź²¼ė‹¤.

$ cat .git/HEAD
ref: refs/heads/master

git checkout test 넼 ģ‹¤ķ–‰ķ•˜ė©“ Gitģ€ HEAD ķŒŒģ¼ģ„ ģ•„ėž˜ģ™€ ź°™ģ“ 바꾼다.

$ cat .git/HEAD
ref: refs/heads/test

git commit ģ„ ģ‹¤ķ–‰ķ•˜ė©“ 커밋 ź°œģ²“ź°€ ė§Œė“¤ģ–“ģ§€ėŠ”ė°, ģ§€źøˆ HEADź°€ 가리키고 ģžˆė˜ ģ»¤ė°‹ģ˜ SHA-1 ź°’ģ“ ź·ø 커밋 ź°œģ²“ģ˜ ė¶€ėŖØė”œ ģ‚¬ģš©ėœė‹¤.

ģ“ ķŒŒģ¼ė„ ģ†ģœ¼ė”œ 직접 ķŽøģ§‘ķ•  수 ģžˆģ§€ė§Œ git symbolic-ref ė¼ėŠ” 명령얓가 ģžˆģ–“ģ„œ 좀 ė” ģ•ˆģ „ķ•˜ź²Œ ģ‚¬ģš©ķ•  수 ģžˆė‹¤. ģ“ ėŖ…ė ¹ģœ¼ė”œ HEADģ˜ ź°’ģ„ ģ½ģ„ 수 ģžˆė‹¤.

$ git symbolic-ref HEAD
refs/heads/master

HEADģ˜ ź°’ģ„ 변경할 ģˆ˜ė„ ģžˆė‹¤.

$ git symbolic-ref HEAD refs/heads/test
$ cat .git/HEAD
ref: refs/heads/test

refs ķ˜•ģ‹ģ— ė§žģ§€ ģ•Šģœ¼ė©“ ģˆ˜ģ •ķ•  수 없다.

$ git symbolic-ref HEAD test
fatal: Refusing to point HEAD outside of refs/

태그

ģ¤‘ģš”ķ•œ 개첓 세 ź°€ģ§€ėŠ” 모두 ģ‚“ķŽ“ė“¤ź³ (Blob, Tree, 커밋) ģ‚“ķŽ“ė³¼ ź°œģ²“ź°€ ķ•˜ė‚˜ź°€ ė‚Øģ•˜ė‹¤. 태그 ź°œģ²“ėŠ” 커밋 ź°œģ²“ėž‘ 매우 ė¹„ģŠ·ķ•˜ė‹¤. 커밋 개첓처럼 ėˆ„ź°€, ģ–øģ œ 태그넼 ė‹¬ģ•˜ėŠ”ģ§€ 태그 ė©”ģ‹œģ§€ėŠ” ė¬“ģ—‡ģ“ź³  ģ–“ė–¤ ģ»¤ė°‹ģ„ ź°€ė¦¬ķ‚¤ėŠ”ģ§€ģ— ėŒ€ķ•œ 정볓가 ķ¬ķ•Øėœė‹¤. 태그 ź°œģ²“ėŠ” Tree ź°œģ²“ź°€ ģ•„ė‹ˆė¼ 커밋 개첓넼 ź°€ė¦¬ķ‚¤ėŠ” ź²ƒģ“ ź·ø ė‘˜ģ˜ ģ°Øģ“ė‹¤. ėøŒėžœģ¹˜ģ²˜ėŸ¼ 커밋 개첓넼 ź°€ė¦¬ķ‚¤ģ§€ė§Œ 옮길 ģˆ˜ėŠ” 없다. 태그 ź°œģ²“ėŠ” 늘 ź·ø ģ“ė¦„ģ“ ėœ»ķ•˜ėŠ” ģ»¤ė°‹ė§Œ 가리킨다.

Gitģ˜ 기쓈 ģ—ģ„œ 배웠듯 ķƒœź·øėŠ” Annotated ķƒœź·øģ™€ Lightweight 태그 두 ģ¢…ė„˜ė”œ ė‚˜ė‰œė‹¤. 먼저 ģ•„ėž˜ģ™€ ź°™ģ“ Lightweight 태그넼 ė§Œė“¤ģ–“ ė³“ģž.

$ git update-ref refs/tags/v1.0 cac0cab538b970a37ea1e769cbbde608743bc96d

Lightwieght ķƒœź·øėŠ” ė§Œė“¤źø° 쉽다. ėøŒėžœģ¹˜ėž‘ ė¹„ģŠ·ķ•˜ģ§€ė§Œ ėøŒėžœģ¹˜ģ²˜ėŸ¼ 옮길 ģˆ˜ėŠ” 없다. ģ“ģ— 비핓 Annotated ķƒœź·øėŠ” 좀 ė” ė³µģž”ķ•˜ė‹¤. Annotated 태그넼 ė§Œė“¤ė©“ Gitģ€ 태그 개첓넼 ė§Œė“¤ź³  거기에 ģ»¤ė°‹ģ„ ź°€ė¦¬ķ‚¤ėŠ” Refs넼 ģ €ģž„ķ•œė‹¤. Annotated ķƒœź·øėŠ” ģ»¤ė°‹ģ„ 직접 가리키지 ģ•Šź³  태그 개첓넼 가리킨다. -a ģ˜µģ…˜ģ„ 주고 Annotated 태그넼 ė§Œė“¤ģ–“ ķ™•ģøķ•“ė³“ģž.

$ git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 -m 'test tag'

태그 ź°œģ²“ģ˜ SHA-1 ź°’ģ„ ķ™•ģøķ•œė‹¤.

$ cat .git/refs/tags/v1.1
9585191f37f7b0fb9444f35a9bf50de191beadc2

git cat-file -p ėŖ…ė ¹ģœ¼ė”œ 핓당 SHA-1 ź°’ģ˜ ė‚“ģš©ģ„ ģ”°ķšŒķ•œė‹¤.

$ git cat-file -p 9585191f37f7b0fb9444f35a9bf50de191beadc2
object 1a410efbd13591db07496601ebc7a059dd55cfe9
type commit
tag v1.1
tagger Scott Chacon <schacon@gmail.com> Sat May 23 16:48:58 2009 -0700

test tag

object 부분에 ģžˆėŠ” SHA-1 ź°’ģ“ ģ‹¤ģ œė”œ ķƒœź·øź°€ ź°€ė¦¬ķ‚¤ėŠ” ģ»¤ė°‹ģ“ė‹¤. 커밋 개첓뿐만 ģ•„ė‹ˆė¼ ėŖØė“  Git ź°œģ²“ģ— 태그넼 달 수 ģžˆė‹¤. 커밋 ź°œģ²“ģ— 태그넼 ė‹¤ėŠ” ź²ƒģ“ ģ•„ė‹ˆė¼ Git ź°œģ²“ģ— 태그넼 ė‹¤ėŠ” ź²ƒģ“ė‹¤. Gitģ„ ź°œė°œķ•˜ėŠ” ķ”„ė”œģ ķŠøģ—ģ„œėŠ” ź“€ė¦¬ģžź°€ ģžģ‹ ģ˜ GPG ź³µź°œķ‚¤ė„¼ Blob 개첓딜 ģ¶”ź°€ķ•˜ź³  ź·ø ķŒŒģ¼ģ— 태그넼 ė‹¬ģ•˜ė‹¤. ģ•„ėž˜ ėŖ…ė ¹ģœ¼ė”œ ź·ø ź³µź°œķ‚¤ė„¼ ķ™•ģøķ•  수 ģžˆė‹¤.

$ git cat-file blob junio-gpg-pub

Linux Kernel ģ €ģž„ģ†Œģ—ė„ ģ»¤ė°‹ģ“ ģ•„ė‹Œ 다넸 개첓넼 ź°€ė¦¬ķ‚¤ėŠ” 태그 ź°œģ²“ź°€ ģžˆė‹¤. ź·ø ķƒœź·øėŠ” ģ €ģž„ģ†Œģ— ģ²˜ģŒģœ¼ė”œ ģ†ŒģŠ¤ ģ½”ė“œė„¼ ģž„ķ¬ķŠøķ–ˆģ„ ė•Œ ź·ø 첫 Tree 개첓넼 가리킨다.

리모트

리모트 Refsė¼ėŠ” ź²ƒė„ ģžˆė‹¤. 리모트넼 ģ¶”ź°€ķ•˜ź³  Push ķ•˜ė©“ Gitģ€ 각 ėøŒėžœģ¹˜ė§ˆė‹¤ Push ķ•œ ė§ˆģ§€ė§‰ ģ»¤ė°‹ģ“ ė¬“ģ—‡ģøģ§€ refs/remotes 디렉토리에 ģ €ģž„ķ•œė‹¤. 예넼 들얓, origin ģ“ė¼ėŠ” 리모트넼 ģ¶”ź°€ķ•˜ź³  master ėøŒėžœģ¹˜ė„¼ Push ķ•œė‹¤.

$ git remote add origin git@github.com:schacon/simplegit-progit.git
$ git push origin master
Counting objects: 11, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 716 bytes, done.
Total 7 (delta 2), reused 4 (delta 1)
To git@github.com:schacon/simplegit-progit.git
  a11bef0..ca82a6d  master -> master

origin ģ˜ master ėøŒėžœģ¹˜ģ—ģ„œ ģ„œė²„ģ™€ ė§ˆģ§€ė§‰ģœ¼ė”œ źµķ™˜ķ•œ ģ»¤ė°‹ģ“ ģ–“ė–¤ ź²ƒģøģ§€ refs/remotes/origin/master ķŒŒģ¼ģ—ģ„œ ķ™•ģøķ•  수 ģžˆė‹¤.

$ cat .git/refs/remotes/origin/master
ca82a6dff817ec66f44342007202690a93763949

refs/heads 에 ģžˆėŠ” Refsģø ėøŒėžœģ¹˜ģ™€ 달리 리모트 RefsėŠ” Checkout ķ•  수 없고 ģ½źø° ģš©ė„ė”œė§Œ 쓸 수 ģžˆėŠ” ėøŒėžœģ¹˜ģø ź²ƒģ“ė‹¤. ģ“ 리모트 RefsėŠ” ģ„œė²„ģ˜ ėøŒėžœģ¹˜ź°€ ź°€ė¦¬ķ‚¤ėŠ” ģ»¤ė°‹ģ“ ė¬“ģ—‡ģøģ§€ 적얓둔 ģ¼ģ¢…ģ˜ ė¶ė§ˆķ¬ģ“ė‹¤.

scroll-to-top