[GIT] โก๏ธ ํ๊ทธ ๊ธฐ๋ฅ ๋ฐ ์ฌ์ฉ๋ฒ (git tag)
git ํ๊ทธ(Tag)
git์์ ํ๊ทธ๋ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ฌด์ธ๊ฐ ํ์๋ฅผ ํด๋๊ธฐ ์ํ ํ๊น ๊ธฐ๋ฅ์ ์ํ ๊ฒ์ผ๋ก, ํน์ ์ปค๋ฐ์ ํ๊ทธํด ๋๋ ๊ฒ์ด๋ค.
ํน์ ์ปค๋ฐ์ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ผ๊ณ ์๊ฐํด๋ ์ข๋ค.
์ด๋ ๊ฒ ํ๊ทธ๋ฅผ ๋ถ์ฌ๋์ผ๋ฉด, ์ปค๋ฐ๋ฒํธ๋ฅผ ์ ๋ ๋์ ์ ํ๊ทธ๋ช ์ ์ ์ด์ ๊ฐ๊ฒฐํ๊ฒ ์์ฉํ ์ ๋ ์๋ค. ($ git reset d07c24e ๋์ $ git reset v1.0.0 ์ผ๋ก)
๋์ค์ ์์ ์ ํ๋ค๋ณด๋ฉด ์๋ฐฑ๊ฐ์ ์ปค๋ฐ๋ค์ด ์์ผํ ๋ฐ, ๊ทธ ์ปค๋ฐ๋ค ์ค์ ์ค์ํ๊ฒ๋ง ํ๊ทธ๋ฅผ ์ง์ ํด์ ๊ฐ๋ ์ฑ์๊ฒ ์ฌ์ฉํ ์ ์๋ค.
์ปค๋ฐ๊ณผ ํ๊ทธ์ ์ฐจ์ด์ ์ด๋ผ๊ณ ํ๋ค๋ฉด ์ปค๋ฐ์ ๊ฒฝ์ฐ checkout ํ์ฌ ๋ด์ฉ์ ์์ ํ ์ ์์ผ๋,
ํ๊ทธ๋ ์์ ์ด ๋ถ๊ฐ๋ฅ ํ๋ฉฐ, ๋ฐ๋ผ์ ์ฝ๊ธฐ์ ์ฉ ์ปค๋ฐ๊ฐ์ ๊ฐ๋ ์ด๋ค.
๋ณดํต ํ๊ทธ๋ ์ํํธ์จ์ด์ ๋ฒ์ ์ ๋ฆด๋ฆฌ์ฆ ํ ๋ ์ฌ์ฉํ๋ค.
์๋ฅผ๋ค์ด ์ ํ์ด v1.0 ์ด ๋ฆด๋ฆฌ์ฆ ๋ ๋ ํ๊น ์ ํ๋ฒ ํด ๋๊ณ , v1.1 ๋ฒ์ ์ ๊ฐ๋ฐํ๋ฉด์ ๊ทธ ์ฌ์ด์ ๋ง๋ค์ด์ง๋ ๋ธ๋์น๋ค๊ณผ ์ปค๋ฐ๋ค์ด ์กด์ฌํ๋๋ฐ ์ด๋ฌํ ๊ฒ๋ค์ ์ปค๋ฐ์ผ๋ก๋ง ๊ด๋ฆฌํ๋ค๊ฐ, v1.1 ๋ฒ์ ์ด ์์ฑ๋๋ ์ปค๋ฐ์ ํ๊น ์ ํด๋๋ ๊ฒ์ด๋ค.
git tag (ํ๊ทธ ์กฐํ)
tag ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ๋ก์ปฌ ์ ์ฅ์์ ๋ชจ๋ ํ๊ทธ๋ฅผ ์กฐํํ ์ ์๋ค
ํ๊ทธ๋ ๋ฌธ์ ์์๋๋ก ์ ๋ ฌํ์ฌ ๋ณด์ฌ์ฃผ๋ฏ๋ก ๋ฒ์ ํ์์ ์ ๋ฐ๋ฅธ๋ค๋ฉด ๊ฐ์ฅ ์ค๋๋ ๋ฒ์ ์ด ๊ฐ์ฅ ๋จผ์ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
$ git tag
v0.1.0
v0.1.1
v0.2.0
...
tag ๋ช ๋ น์ด์ -l ๋๋ --list ์ต์ ๋ฐ ์์ผ๋์นด๋(*) ํจํด๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ง๋ ํ๊ทธ๋ฅผ ์กฐํํ ์ ์๋ค.
๋ง์ฝ ํน์ 1.8๋ฒ์ ๋์ ๋ชจ๋ ํ๊ทธ๋ฅผ ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5.1
v1.8.5.2
v1.8.5.3
git show-ref --tags --dereference (์ปค๋ฐ๋ฒํธ์ ํ๊ทธ ์กฐํ)
# ์ปค๋ฐ๋ฒํธ์ ํ๊ทธ๋ฅผ ๋ฆฌ์คํธ๋ก ๊ฐ๋จํ ์กฐํํ ์ ์์ด, ์๊ธดํ๊ฒ ์ฐ์ธ๋ค.
$ git show-ref --tags --dereference
git ls-remote --tags (์๊ฒฉ์ ์ฅ์์ ์๋ ํ๊ทธ ์กฐํ)
# ์๊ฒฉ์ ์ฅ์์ ์๋ ํ๊ทธ ๋์ดํ๊ธฐ
$ git ls-remote --tags
From https://github.com/skyksit/blog.git
c4a63e238b4176103532563b270c374602488275 refs/tags/v1.0.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.1
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0
88c34a1ca247851f721738e36ca4228cf8b0724c refs/tags/v1.2.0^{}
git show
show ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํ๊ทธ์ ๋ํ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค.
$ git show v0.1.0
git tag <ํ๊ทธ ๋ฒ์ ผ> (ํ๊ทธ ์์ฑ)
git์ ํ๊ทธ๋ ์์ฑํ ๋ lightweight์ annotated ๋ ์ข ๋ฅ๊ฐ ์๋ค.
- Lightweight :
- ํน์ ์ปค๋ฐ์ ๊ฐ๋ฅดํค๋ ์ญํ ์ ํ๋ค. (ํฌ์ธํฐ ์ญํ )
- ๋จ์ํ ๋ฒ์ ๊ฐ์ ํ๊ทธ์ด๋ฆ๋ง์ ๋จ๊ธฐ๋ ํ๊ทธ - Annotated :
- ๋ง๋ ์ฌ๋, ์ด๋ฉ์ผ, ๋ ์ง, ๋ฉ์์ง๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ๋ก ์ ์ฅํ๋ค
- GPG(GNU Privacy Guard)๋ก ์๋ช ํ ์ ์๋ค.
- ๋ฐ๋ผ์ Lightweightํ๊ทธ์๋ ๋ฌ๋ฆฌ ๊ณ ์ ์ ์ ์ฅ๊ณต๊ฐ์ด ๋ ์๊ธด๋ค.
Lightweight ํ๊ทธ๋ง์ ๋จ๊ธฐ๋ฉด ์ด๊ฒ ์ด๋ค ํ๊ทธ์ธ์ง ๋๊ฐ ๋ง๋ ๊ฒ์ธ์ง์ ๋ํ ์ ๋ณด๋ค์ ์ ์ ์๊ธฐ ๋๋ฌธ์
Annotated ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
๊ทธ๋ฌ๋ ์์์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋๋ ํ๊ทธ์ธ ๊ฒฝ์ฐ Lightweight ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
Lightweight ํ๊ทธ ์์ฑ
# ํ๊ทธ๋ฅผ ์์ฑ
$ git tag <TAG NAME>
$ git tag v1.0
ํน์ ์ปค๋ฐ ์ ํ ํ๊ทธ ์ง์
์ด์ ํ์คํ ๋ฆฌ๋ฅผ ๊ฒ์ํด์ ์ด์ ์ปค๋ฐ์ ๋ํด ํ๊ทธ๋ฅผ ์ง์ ํ ์๋ ์๋ค.
# ์ปค๋ฐ ๋ก๊ทธ๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ์ถ๋ ฅ
$ git log --pretty=oneline
# git tag <ํ๊ทธ๋ช
> <์ปค๋ฐ๋ฒํธ>
$ git tag v0.4 c78248 # c78248 ์ด์ ์ปค๋ฐ์ ํ๊ทธ ์ง์
Annotated ํ๊ทธ ์์ฑ
lightweight ํ๊ทธ๋ ํ๊ทธ์ ๋ํ ์ ๋ณด๋ ์๊ธฐ ๋๋ฌธ์ ํ๊ทธ๋ฅผ ๋จ๊ธฐ๋ฉด์ ์ ๋ณด๋ฅผ ๊ฐ์ด ๋จ๊ธฐ๊ณ ์ถ์ ๊ฒฝ์ฐ Annotated ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค. (์ปค๋ฐ ๋ฉ์ธ์ง์ฒ๋ผ ๋ณด๋ฉด ๋๋ค)
Annotated ํ๊ทธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ tag -a ์ต์ ์ ์ฌ์ฉํ๋ค.
์ปค๋ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๊ทธ๋ฅผ ๋จ๊ธธ๋์๋ ๋ฉ์์ง๋ฅผ ๋จ๊ฒจ์ผ ํ๋ฉฐ -m ์ต์ ์ ์ฌ์ฉํ๋ฉด ํ๊น ๊ณผ ๋์์ ๋ฉ์์ง๋ฅผ ์์ฑํ ์ ์๋ค.
- -a ๋ Annotated ํ๊ทธ๋ฅผ ์๋ฏธํ๋ค.
- -m ์ต์ ์ ๋ฉ์์ง๋ฅผ ํจ๊ป ์ ์ฅํ ๋ ์ฌ์ฉํ๋ค. ๋ถ์ด์ง ์์ผ๋ฉด ์๋์ผ๋ก Git ํธ์ง๊ธฐ๋ฅผ ์คํ์ํจ๋ค.
# Annotated ํ๊ทธ ์์ฑ & ํ๊ทธ ๋ฉ์ธ์ง
$ git tag -a <TAG NAME> -m "<TAG MESSAGE>"
$ git tag -a v1.1 -m "second tag 1.1"
# ํน์ ์ปค๋ฐ์ Annotated ํ๊ทธ๋ก ์ง์
$ git tag -a v0.1.0 322b42f
lightweight ํ๊ทธ vs annotated ํ๊ทธ ์ฐจ์ด ๐ฅ
ํ๊ทธ๋ฅผ ์กฐํํด ๋ณด์.
show-ref --tags ๋ช ๋ น์ด๋ฅผ ๊ทธ๋ฅ ์ฌ์ฉํ๋ฉด, ํ๊ทธ ๋ ํผ๋ฐ์ค๋ค์ ๋ณด์ฌ์ค๋ค.
# lightweightํ๊ทธ์ด๋ annotatedํ๊ทธ์ด๋ ๊ทธ๋ฅ ํ๊ทธ๋ง ๋์ดํด์ ๋ณด์ฌ์ค๋ค.
$ git show-ref --tags
...
3b0cb630236559e57c804642ef81e0d9f80def10 refs/tags/v2.2.1 # annotated ํ๊ทธ
a859fc475db6d86b0a7e9b324c5ec3fb833f87c5 refs/tags/v2.2.2-lw # lightweight ํ๊ทธ == ์ปค๋ฐ๋ฒํธ
๊ทธ๋ฌ๋ ์ด๋ ๊ฒ๋ง ์กฐํํ๋ฉด ์ด๋ค๊ฒ lightweight ํ๊ทธ์ธ์ง annotated ํ๊ทธ์ธ์ง ์ฌ์ค์ ๋ถ๊ฐ์ ํ ์๊ฐ ์๋ค.
๊ทธ๋์ --dereference ์ต์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด, ํ๊ทธ ๊ฐ์ฒด๋ฅผ dereferencingํ ๊ฒฐ๊ณผ๋ก, ํ๊ทธ ๊ฐ์ฒด๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ปค๋ฐ ID(66b7e57)๋ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
Dereferencing
C ๋ฑ์ ์ธ์ด์์, ํฌ์ธํฐ ๊ฐ ์์ ๋ถ์ฌ์ ํด๋น ๋ ํผ๋ฐ์ค๊ฐ ๊ฐ๊ณ ์๋ ๋ด์ฉ์ ๊ฐ์ ธ์ค๋ * ์ฐ์ฐ์๋ฅผ dereference operator๋ผ ํ๋ฉฐ, ์ด ๋์์ ํฌ์ธํฐ๋ฅผ dereferencingํ๋ค๊ณ ๋ถ๋ฅธ๋ค.
# ammptated ํ๊ทธ๋ ^{}๋ก ๋ฐ๋ก ํ์ํด์ ๋ ํผ๋ฐ์คํ๋ ์ปค๋ฐ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค
$ git show-ref --tags --dereference
...
3b0cb630236559e57c804642ef81e0d9f80def10 refs/tags/v2.2.1 # annotated ํ๊ทธ
66b7e57d4b11283078f974a7818b77e268bbc5c0 refs/tags/v2.2.1^{} # annotated ํ๊ทธ๊ฐ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ๋ฒํธ
a859fc475db6d86b0a7e9b324c5ec3fb833f87c5 refs/tags/v2.2.2-lw # lightweight ํ๊ทธ == ์ปค๋ฐ๋ฒํธ
์ฐ์ annotated ํ๊ทธ์ lightweight ํ๊ทธ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ณด์ฌ์ฃผ๋, git show-ref --tags --dereference ๋ช
๋ น์ด ๋ถํฐ ํํค์ณ ๋ณด์.
show-ref๋ ๋ก์ปฌ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ ํผ๋ฐ์ค๋ค์ ๋ณด์ฌ์ฃผ๋ ๋ช ๋ น์ด์ด๋ค.
--dereference๋ ๋ฌธ์ ๊ทธ๋๋ก ํ๊ทธ๋ฅผ dereferencingํ์ฌ ํ๊ทธ๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ด์ฉ๋ ๋ณด์ฌ์ค๋ค.
์ด ๊ฒฝ์ฐ ^{}๋ฅผ ๋ค์ ๋ถ์ฌ์ ๋ณด์ฌ์ค๋ค.
๊น์์ annotated ํ๊ทธ๋ ํ๊ทธํ๊ณ ์๋ ๊ฐ์ฒด์ ๋ฉํ๋ฐ์ดํฐ์ SHA-1๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๊ทธ ์์ฒด์ ๋ฉ์์ง์ ID๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด์ด๋ค.
lightweight ํ๊ทธ๋ ํ๊ทธ ๊ฐ์ฒด๊ฐ ์๋๊ณ , ํ๊ทธํ ๊ฐ์ฒด๋ฅผ ๊ทธ์ ๊ฐ๋ฆฌํค๊ณ ๋ง ์๋ค.
์์ง ์ดํด๊ฐ ๋์ง ์๋๋ค๋ฉด, ๋ค์ git ๊ทธ๋ํ์ ๋น๊ตํด์ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
lightweight ํ๊ทธ
- ์ปค๋ฐ๋ฒํธ๊ฐ ๊ณง ํ๊ทธ์ด๋ค. lightweightํ๊ทธ๋ ๊ทธ๋ฅ ์ปค๋ฐ๋ฒํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- v0.4 : c782f1 (ํ๊ทธ์ด์ ์ปค๋ฐ ๋ฒํธ)
- v1.0.0 : d07c24 (ํ๊ทธ์ด์ ์ปค๋ฐ ๋ฒํธ)
annotated ํ๊ทธ
- ์์ฒด ๋ฉ์ธ์ง,์ด๋ฉ์ผ ๋ฑ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ํ๊ทธ๋ฒํธ์ ์ปค๋ฐ๋ฒํธ๋ก ๋๋์ด์ ธ ์๋ค.
- ^{} ๋ถ์ด์์ง ์์๊ฑด ์์ฒด ํ๊ทธ๋ฒํธ, ^{} ๋ถ์ด์๋ ๊ฒ์ annotatedํ๊ทธ๊ฐ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ ๋ฒํธ์ด๋ค.
- 1.1 : ab6bac (annotated ์์ฒด ํ๊ทธ๋ฒํธ)
- v1.0 : ed4449 (annotated ์์ฒด ํ๊ทธ๋ฒํธ)
- 1.1^{} :b84df1 (์ปค๋ฐ ๋ฒํธ)
- v1.0^{} : 428d64 (์ปค๋ฐ ๋ฒํธ)
ํ๊ทธ ์ญ์
๋ก์ปฌ ์ ์ฅ์์ ํ๊ทธ๋ฅผ ์ญ์ ํ๋ ค๋ฉด -d ๋๋ --delete ์ต์ ์ ์ฌ์ฉํ๋ค
$ git tag -d v0.1.0
ํ๊ทธ ์์
lightweight ํ๊ทธ ์์
# git tag <NEW TAG NAME> <OLD TAG NAME>
$ git tag v1.1.1 v1.1.0
# git tag -d <OLD TAG NAME>
$ git tag -d v1.1.0
annotated ํ๊ทธ ์์
$ git show-ref --tags --dereference
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0
88c34a1ca247851f721738e36ca4228cf8b0724c refs/tags/v1.2.0^{}
# git tag -a <NEW TAG NAME> <OLD TAG NAME>^{} -m "<NEW TAG MESSAGE>"
$ git tag -a v1.3.0 v1.2.0^{} -m "<NEW TAG MESSAGE>"
# ์ด๋ ๊ฒ commit checksum ์ ๋ณด๋ก ์๋ก์ด tag ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค
$ git tag -a v1.3.0 88c34a1 -m "<NEW TAG MESSAGE>"
git push origin <ํ๊ทธ ์ด๋ฆ> (ํ๊ทธ ์๊ฒฉ์ ์ฅ์ push ํ๊ธฐ)
git push ๋ช ๋ น์ ์๋์ผ๋ก ๋ฆฌ๋ชจํธ ์๋ฒ์ ํ๊ทธ๋ฅผ ์ ์กํ์ง ์๋๋ค.
๊ณ ๋ก ํ๊ทธ๋ฅผ ๋ง๋ค์์ผ๋ฉด ์๋ฒ์ ๋ณ๋๋ก Push ํด์ผ ํ๋ค.
# git push origin <ํ๊ทธ ์ด๋ฆ>
$ git push origin v1.0
๋ง์ฝ ํ ๋ฒ์ ํ๊ทธ๋ฅผ ๋ชจ๋ Push ํ๊ณ ์ถ๋ค๋ฉด --tags ์ต์ ์ ์ถ๊ฐํ์ฌ git push ๋ช ๋ น์ ์คํํ๋ค.
# ๋ชจ๋ ํ๊ทธ๋ฅผ ํ๊บผ๋ฒ์ pushํ๊ธฐ
$ git push origin --tags
์ด์ ๋๊ตฐ๊ฐ ์ ์ฅ์์์ Clone ํ๊ฑฐ๋ Pull ํ๋ฉด ๋ชจ๋ ํ๊ทธ ์ ๋ณด๋ ํจ๊ป ์ ์ก๋๋ค.
์๊ฒฉ ์ ์ฅ์ ํ๊ทธ ์ญ์
ํ๊ทธ ์ญ์ ์๋ 3๊ฐ์ง ๋ช ๋ น์ด๋ก ๊ฐ๋ฅํ๋ค.
$ git push <REMOTE> :refs/tags/<TAG NAME>
$ git push <REMOTE> :<TAG NAME>
$ git push <REMOTE> -d <TAG NAME>
# ์๊ฒฉ์ ์ฅ์์ ์๋ ํ๊ทธ ๋์ดํ๊ธฐ
$ git ls-remote --tags
From https://github.com/skyksit/blog.git
c4a63e238b4176103532563b270c374602488275 refs/tags/v1.0.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.1
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0
88c34a1ca247851f721738e36ca4228cf8b0724c refs/tags/v1.2.0^{}
# git push <REMOTE> :refs/tags/<TAG NAME>
$ git push origin :refs/tags/v1.2.0
To https://github.com/skyksit/blog.git
- [deleted] v1.2.0
# git push <REMOTE> :<TAG NAME>
$ git push origin :v1.0.0
To https://github.com/skyksit/blog.git
- [deleted] v1.0.0
# git push <REMOTE> -d <TAG NAME>
$ git push origin -d v1.1.0
To https://github.com/skyksit/blog.git
- [deleted] v1.1.0