Skip to content

Latest commit

ย 

History

History
320 lines (271 loc) ยท 14.2 KB

File metadata and controls

320 lines (271 loc) ยท 14.2 KB

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 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค.
Figure 1. ๋ธŒ๋žœ์น˜ 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 ๊ฐœ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ปค๋ฐ‹ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ๊ทธ ๋‘˜์˜ ์ฐจ์ด๋‹ค. ๋ธŒ๋žœ์น˜์ฒ˜๋Ÿผ ์ปค๋ฐ‹ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ ์˜ฎ๊ธธ ์ˆ˜๋Š” ์—†๋‹ค. ํƒœ๊ทธ ๊ฐœ์ฒด๋Š” ๋Š˜ ๊ทธ ์ด๋ฆ„์ด ๋œปํ•˜๋Š” ์ปค๋ฐ‹๋งŒ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

ch02-git-basics-chapter.asc ์—์„œ ๋ฐฐ์› ๋“ฏ ํƒœ๊ทธ๋Š” 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๋Š” ์„œ๋ฒ„์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์ด ๋ฌด์—‡์ธ์ง€ ์ ์–ด๋‘” ์ผ์ข…์˜ ๋ถ๋งˆํฌ์ด๋‹ค.