Git의 'Tag'(태그)란?
: 커밋을 참조하기 쉽도록 알기 쉬운 이름을 붙이는 것을 말한다.
- 보통 릴리즈할 때 사용한다 (v1.0, 등)
- Git Repository를 clone 하거나 Pull을 하면 모든 태그 정보도 함께 가져온다.
- 한 번 붙인 태그는 브랜치처럼 위치가 이동하지 않고 고정됩니다.
1. Tag 종류 : 일반 태그(Lightweight tag), 주석 태그(Annotated tag)
1. 일반 태그(Lightweight tag) : 특정 커밋에 대한 포인터
ㄴ> '태그명(=이름)'만 붙여 저장되는 태그
ㄴ> 파일에 커밋 체크섬을 저장하는 것뿐이다. 다른 정보는 저장하지 않는다.
ㄴ> cf) '브랜치'와 비슷하지만 브랜치처럼 가리키는 지점을 최신 커밋으로 이동시키지 않는다.
2. 주석 태그(Annotated tag)
ㄴ> '태그명(=이름)'을 붙이고, '태그에 대한 설명', GPG로 '서명'도 가능하다.
ㄴ> (Git 데이터베이스에) '태그를 만든 사람이름과 이메일'과 '태그를 만든 날짜', '태그 메시지'도 저장한다.
ㄴ> 일반적으로 Annotated 태그를 만들어 이 모든 정보를 사용할 수 있도록 하는 것이 좋다.
하지만 임시로 생성 태그나 이러한 정보가 필요가 없는 경우 Lightweight 태그를 사용
2. Tag 조회하기 : $ git tag
- $ git tag 명령어 실행 시 알파벳 순서로 태그를 조회한다.
2-1. Tag 검색하기 : $ git tag -l <와일드카드 패턴>
- ('-l' 또는 '--list' 옵션) 및 (와일드카드 패턴)과 함께 사용하면 태그를 검색하여 조회할 수 있다.
- 와일드카드를 사용하여 태그 목록을 검색하는 경우에는 반드시 -l 또는 --list 옵션을 같이 써 줘야 원하는 결과를 얻을 수 있다.
ㄴ> ex) "1.8.5" 버전의 태그들만 검색하는 경우
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
2-2. Tag 정보확인 : $ git show
- $ git show 명령어로 '태그 정보'와 '커밋 정보'를 모두 확인할 수 있다.
ㄴ> ex)
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
ㄴ> 커밋 정보를 보여주기 전에 먼저 '태그 만든 사람(Tagger)', '태그 만든 날짜(Date)',
'태그 메시지'가 무엇인지 보여준다.
3. Tag 붙이기 : $ git tag [-옵션] <태그명>명령어
- $ git tag 명령어로 태그를 붙일 수도 있다.
3-1. 일반 태그(Lightweight tag) 붙이기 : $ git tag <태그명>
- 일반 태그(Lightweight tag) 만들 때는 $git tag 명령어에 <태그명(=이름)>만 달아준다.
ㄴ> ※ 주의) -a, -s, -m 옵션을 사용하지 않는다. 태그명(=이름)만 달아줘야 한다.
ㄴ> ex)
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
ㄴ> 일반 태그(Lightweight tag)에서 $ git show 를 실행하면 커밋 정보만을 보여준다. (아닌 경우 태그 정보도 확인됨)
ㄴ> ex) 일반 태그(Lightweight tag)에서 $ git show 를 실행
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
3-2. 주석 태그(Annotated tag) 붙이기 : $ git tag -a <태그명>
- 주석 태그(Anotated tag) 만들 때는 $git tag 명령어에 -a옵션을 사용한다.
ㄴ> -m 옵션 : 태그를 저장할 때 '태그 메시지'를 함께 저장하는 옵션
ㄴ> 명령을 실행할 때 메시지를 입력하지 않으면 Git은 편집기를 실행시킨다.
ㄴ> ex) 태그명이 "v1.4"이고, 태그메시지가 "my version 1.4"인 주석 태그 붙이기
$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4
4. 예전 커밋사항에 Tag 붙이기
: $ git tag -a <태그명> <커밋사항의 체크섬>
: 커밋 시 태그하지 못했다고 해도 나중에 태그를 붙일 수 있다.
ㄴ> 명령의 끝에 <커밋사항 체크섬>을 명시하는데 긴 체크섬을 전부 사용할 필요는 없다.
ㄴ> ex1)
ⓐ 기존에 커밋한 히스토리는 아래와 같다
$ git log --pretty=oneline
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
ⓑ 위 5line의 "updated rakefile'' 커밋을 v1.2로 태그하지 못하여 추가하려 한다면 : $ git tag -a v1.2 9fceb02
$ git tag -a v1.2 9fceb02
ⓒ 예전 커밋사항에 태그 추가되었는지 확인 : 태그명만 확인 시 $ git tag를 사용하고,
상세한 커밋&태그 정보 확인 시 $git show 1.2
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date: Sun Apr 27 20:43:35 2008 -0700
updated rakefile
...
5. Remote Repository에 Tag올리기
: $ git push <Repository alias> <태그명>
- $ git push 명령은 Remote Repository에 태그를 전송하지 않아
태그를 만들었으면 서버에 별도로 $git push명령을 써줘야 한다!! ★
ㄴ> $ git push origin <태그 이름> 명령어를 사용하며 브랜치를 공유하는 것과 같다.
ㄴ> ex1)
$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
- '-tags' 옵션 : 한 번에 여러 개 태그를 Remote Repository에 공유한다.
$ git push <Repository alias> <태그명> -tags |
ㄴ> ex▼)
$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
6. Tag명으로 Remote Repository 커밋사항 가져오기(=태그를 Checkout 하기)
: $ git checkout <태그명>
-태그가 특정 버전을 가리키고 있고, 특정 버전의 파일을 체크아웃 해서 확인하고 싶다면 '태그를 Checkout 한다.'
ㄴ> ex1)
$ git checkout 2.0.0
Note: checking out '2.0.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch>
HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final
$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image
ㄴ> ※ 매우 주의) 태그를 체크아웃하면 "detached HEAD"(떨어져나온 HEAD)상태가 된다.
이 상태에서 작업 후 커밋을 만들면, 태그는 그대로 있으나 새로운 커밋이 하나 쌓인 상태가 되고
새 커밋에 도달할 수 있는 방법이 따로 없게 된다. (커밋의 해시 값을 정확히 기억하고 있으면 가능하긴 하다만..)
특정 태그의 상태에서 새로 작성한 커밋이 접근가능하려면 반드시 브랜치를 만들어서 작업하는 것이 좋다.
ㄴ> ex1-1)
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
ㄴ> 물론 이렇게 브랜치를 만든 후에 version2 브랜치에 커밋하면 브랜치는 업데이트된다.
하지만, v2.0.0 태그는 가리키는 커밋이 변하지 않았으므로 두 내용이 가리키는 커밋이 다르다.
END!
스터디 도움 참조 블로그 (References)
- 버전 관리(VC) 위키백과 https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC - 누구나 쉽게 이해할 수 있는 Git 입문 https://backlog.com/git-tutorial/kr/ /발전편/태그 https://backlog.com/git-tutorial/kr/stepup/stepup4_1.html - git--distributed-even-if-your-workflow-isnt (Pro Git Book) https://git-scm.com/book/en/v2 - git--distributed-even-if-your-workflow-isnt (Pro Git Book) / ch2.6 https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%ED%83%9C%EA%B7%B8 |