์ด๋ค ์ปค๋ฐ 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 fRefs๊ฐ ์์ผ๋ฉด ์ปค๋ฐ์ ์ฐพ๊ธฐ ์ฌ์์ง๋ค. ์ฌ์ค ๋ด๋ถ๋ ์๋์ฒ๋ผ ๋จ์ํ๋ค.
$ echo 1a410efbd13591db07496601ebc7a059dd55cfe9 > .git/refs/heads/masterSHA-1 ๊ฐ ๋์ ์ ์ง๊ธ ๋ง๋ Refs๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
$ git log --pretty=oneline master
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commitRefs ํ์ผ์ ์ง์ ๊ณ ์น๋ ๊ฒ์ด ์ข ๋ชป๋ง๋
ํ๋ค. Git์๋ ์ข ๋ ์์ ํ๊ฒ ๋ฐ๊ฟ ์ ์๋ git update-ref ๋ช
๋ น์ด ์๋ค.
$ git update-ref refs/heads/master 1a410efbd13591db07496601ebc7a059dd55cfe9Git ๋ธ๋์น์ ์ญํ ์ด ๋ฐ๋ก ์ด๊ฑฐ๋ค. ๋ธ๋์น๋ ์ด๋ค ์์ ์ค ๋ง์ง๋ง ์์ ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ๋๋ Refs์ด๋ค. ๊ฐ๋จํ ๋ ๋ฒ์งธ ์ปค๋ฐ์ ๊ฐ๋ฆฌํค๋ ๋ธ๋์น๋ฅผ ๋ง๋ค์ด ๋ณด์.
$ git update-ref refs/heads/test cac0ca๋ธ๋์น๋ ์ง์ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ๊ณผ ๊ทธ ์ปค๋ฐ์ผ๋ก ๋ฐ๋ผ๊ฐ ์ ์๋ ๋ชจ๋ ์ปค๋ฐ์ ํฌํจํ๋ค.
$ git log --pretty=oneline test
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit์ด์ Git ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ณด์ธ๋ค.
git branch <branch> ๋ช
๋ น์ ์คํํ๋ฉด Git์ ๋ด๋ถ์ ์ผ๋ก update-ref ๋ช
๋ น์ ์คํํ๋ค. ์
๋ ฅ๋ฐ์ ๋ธ๋์น ์ด๋ฆ๊ณผ ํ ๋ธ๋์น์ ๋ง์ง๋ง ์ปค๋ฐ์ SHA-1 ๊ฐ์ ๊ฐ์ ธ๋ค update-ref ๋ช
๋ น์ ์คํํ๋ค.
git branch <branch> ๋ช
๋ น์ ์คํํ ๋ Git์ ์ด๋ป๊ฒ ๋ง์ง๋ง ์ปค๋ฐ์ SHA-1 ๊ฐ์ ์๋ ๊ฑธ๊น?
HEAD ํ์ผ์ ํ ๋ธ๋์น๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐ์ (symbolic) Refs๋ค.
๊ฐ์ Refs๋ผ์ ๋ค๋ฅธ ๊ฒ๊ณผ ๋ค๋ฅด๋ค. ์ด Refs๋ ๋ค๋ฅธ Refs๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด๋ผ์ SHA-1 ๊ฐ์ด ์๋ค. ํ์ผ์ ์ด์ด ๋ณด๋ฉด ์๋์ ๊ฐ์ด ์๊ฒผ๋ค.
$ cat .git/HEAD
ref: refs/heads/mastergit checkout test ๋ฅผ ์คํํ๋ฉด Git์ HEAD ํ์ผ์ ์๋์ ๊ฐ์ด ๋ฐ๊พผ๋ค.
$ cat .git/HEAD
ref: refs/heads/testgit commit ์ ์คํํ๋ฉด ์ปค๋ฐ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋๋ฐ, ์ง๊ธ HEAD๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ปค๋ฐ์ SHA-1 ๊ฐ์ด ๊ทธ ์ปค๋ฐ ๊ฐ์ฒด์ ๋ถ๋ชจ๋ก ์ฌ์ฉ๋๋ค.
์ด ํ์ผ๋ ์์ผ๋ก ์ง์ ํธ์งํ ์ ์์ง๋ง git symbolic-ref ๋ผ๋ ๋ช
๋ น์ด๊ฐ ์์ด์ ์ข ๋ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ช
๋ น์ผ๋ก HEAD์ ๊ฐ์ ์ฝ์ ์ ์๋ค.
$ git symbolic-ref HEAD
refs/heads/masterHEAD์ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์๋ค.
$ git symbolic-ref HEAD refs/heads/test
$ cat .git/HEAD
ref: refs/heads/testrefs ํ์์ ๋ง์ง ์์ผ๋ฉด ์์ ํ ์ ์๋ค.
$ 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 cac0cab538b970a37ea1e769cbbde608743bc96dLightwieght ํ๊ทธ๋ ๋ง๋ค๊ธฐ ์ฝ๋ค. ๋ธ๋์น๋ ๋น์ทํ์ง๋ง ๋ธ๋์น์ฒ๋ผ ์ฎ๊ธธ ์๋ ์๋ค.
์ด์ ๋นํด Annotated ํ๊ทธ๋ ์ข ๋ ๋ณต์กํ๋ค. Annotated ํ๊ทธ๋ฅผ ๋ง๋ค๋ฉด Git์ ํ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ ์ปค๋ฐ์ ๊ฐ๋ฆฌํค๋ Refs๋ฅผ ์ ์ฅํ๋ค.
Annotated ํ๊ทธ๋ ์ปค๋ฐ์ ์ง์ ๊ฐ๋ฆฌํค์ง ์๊ณ ํ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
-a ์ต์
์ ์ฃผ๊ณ Annotated ํ๊ทธ๋ฅผ ๋ง๋ค์ด ํ์ธํด๋ณด์.
$ git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 -m 'test tag'ํ๊ทธ ๊ฐ์ฒด์ SHA-1 ๊ฐ์ ํ์ธํ๋ค.
$ cat .git/refs/tags/v1.1
9585191f37f7b0fb9444f35a9bf50de191beadc2git 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 tagobject ๋ถ๋ถ์ ์๋ SHA-1 ๊ฐ์ด ์ค์ ๋ก ํ๊ทธ๊ฐ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ์ด๋ค.
์ปค๋ฐ ๊ฐ์ฒด๋ฟ๋ง ์๋๋ผ ๋ชจ๋ Git ๊ฐ์ฒด์ ํ๊ทธ๋ฅผ ๋ฌ ์ ์๋ค.
์ปค๋ฐ ๊ฐ์ฒด์ ํ๊ทธ๋ฅผ ๋ค๋ ๊ฒ์ด ์๋๋ผ Git ๊ฐ์ฒด์ ํ๊ทธ๋ฅผ ๋ค๋ ๊ฒ์ด๋ค.
Git์ ๊ฐ๋ฐํ๋ ํ๋ก์ ํธ์์๋ ๊ด๋ฆฌ์๊ฐ ์์ ์ GPG ๊ณต๊ฐํค๋ฅผ Blob ๊ฐ์ฒด๋ก ์ถ๊ฐํ๊ณ ๊ทธ ํ์ผ์ ํ๊ทธ๋ฅผ ๋ฌ์๋ค.
์๋ ๋ช
๋ น์ผ๋ก ๊ทธ ๊ณต๊ฐํค๋ฅผ ํ์ธํ ์ ์๋ค.
$ git cat-file blob junio-gpg-pubLinux 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 -> masterorigin ์ master ๋ธ๋์น์์ ์๋ฒ์ ๋ง์ง๋ง์ผ๋ก ๊ตํํ ์ปค๋ฐ์ด ์ด๋ค ๊ฒ์ธ์ง refs/remotes/origin/master ํ์ผ์์ ํ์ธํ ์ ์๋ค.
$ cat .git/refs/remotes/origin/master
ca82a6dff817ec66f44342007202690a93763949refs/heads ์ ์๋ Refs์ธ ๋ธ๋์น์ ๋ฌ๋ฆฌ ๋ฆฌ๋ชจํธ Refs๋ Checkout ํ ์ ์๊ณ ์ฝ๊ธฐ ์ฉ๋๋ก๋ง ์ธ ์ ์๋ ๋ธ๋์น์ธ ๊ฒ์ด๋ค.
์ด ๋ฆฌ๋ชจํธ Refs๋ ์๋ฒ์ ๋ธ๋์น๊ฐ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ์ด ๋ฌด์์ธ์ง ์ ์ด๋ ์ผ์ข
์ ๋ถ๋งํฌ์ด๋ค.
