git에서도 일정 시점에 tag를 등록하여 원하는 시점까지 버전을 그룹핑하거나 기록해둘 수 있다. 태그는 v1.0처럼 특정 시점에 이름을 붙이는 기능인데, 주로 서비스의 배포 버전을 제공할 때 사용한다. 또한 작업중 되돌아갈 여지가 있는 시점에 붙이기도 한다.


Git의 태그

Git에서 생성할 수 있는 태그는 AnnotatedLightweight 두 가지가 있다.

Annotated 형식의 태그는 Git 데이터베이스에 태그를 만든 사람의 이름, 이메일, 태그생성일, 태그 메세지 등의 정보를 저장한다.

반면 Lightweight 형식의 태그는 이러한 정보를 저장하지 않고 태그만 저장한다. 따라서 추가적인 정보가 필요할 때만 Annotated 형식의 태그를 사용하면 된다.

아래에서 설명하는 명령어는 기본으로 Annotated 형식의 태그를 생성하므로 Lightweight 형식은 따로 설명할 예정이다.


태그 생성하기

태그는 다음 명령어로 생성한다. 태그명과 함께 생성하면 에디터모드에서 해당 태그에 대한 설명 메시지를 추가할 수 있다.

# 새로운 태그이름과 메세지를 생성한다.
# git tag -a <태그명> -m "태그의 설명 메세지"
$ git tag -a v1.0 -m "new tag 1.0"

# -m 명령으로 메세지를 쓰지 않으면 git은 편집기를 실행시킨다. 
# git tag -a <태그명>
$ git tag -a v1.0

만들어진 태그는 다음과 같이 확인한다.

$ git tag
v1.0

위의 명령은 알파벳 순서대로 정리된 태그를 보여준다.


태그 정보 조회하기

show 명령어를 통해 생성된 태그의 정보와 커밋된 정보들을 확인할 수 있다.

$ git show v1.0

# 태그의 정보 
tag v1.0
Tagger: JuliaHwang <[email protected]>
Date:   Tue Oct 05 19:33:10 2017 +0900

add first tag

# 커밋 정보
commit 42073f5a29f37567a635c7745545abf8996a7e7c
Merge: 280b054 bed426b
Author: JuliaHwang <[email protected]>
Date:   Wed Aug 2 16:23:15 2017 +0900

    Merge branch 'master' of github.com:juliahwang/gitpractice into julia


Lightweight 형식의 태그 생성하기

Lightweight 태그는 기본적으로 파일에 커밋 체크섬만을 저장한다. Lightweight 태그를 만들 때는 -a, -s, -m 옵션을 사용하지 않는다.

# lightweight 태그 생성
$ git tag v1.0-lw

# 태그 조회
$ git tag
v1.0
v1.0-lw

생성한 v1.0-lw에 대해 정보를 확인해보면 태그 정보는 출력되지 않는다.

$ git show v1.0-lw
commit 42073f5a29f37567a635c7745545abf8996a7e7c
Merge: 280b054 bed426b
Author: JuliaHwang <[email protected]>
Date:   Wed Aug 2 16:23:15 2017 +0900

    Merge branch 'master' of github.com:juliahwang/gitpractice into julia


태그에 서명하기

GPG(RSA, 즉, 공개키 암호키를 사용한 암호화 방식) 개인키가 있는 경우에는 -s 옵션으로 태그에 서명을 저장할 수 있다.

$ git tag -s v1.0 -m "add signature on v1.0" 

git show 명령어를 통해서는 서명을 확인할 수 있다.


예전 커밋에 태그하기

지나간 커밋에 대해 태그를 하고 싶을 경우에는 커밋 히스토리를 조회하여 태그를 붙이기 위한 커밋 체크섬을 알아야 한다.

log 명령어로 원하는 커밋의 체크섬 일부를 알아낸다.

$ git log --pretty=oneline
9fceb02d0ae598e95dc970b74767f19372d61af8 create new file
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme file
4682c3261057305bdd616e23b64b0857d832627b add remote practice
166ae0c4d3f420721acbb115cc33848dfcc2121a start project

updated readme filev1.1 태그를 붙이려고 한다. 해당 커밋의 체크섬 앞부분 일부를 사용하여 다음과 같이 명령을 실행한다.

$ git tag -a v1.1 -m "add readme" 8a5cbc43

show 명령어를 실행하면 해당 커밋에 태그가 등록된 것을 커밋정보로 확인할 수 있다.


태그를 원격 저장소에 공유하기

git push는 태그를 원격저장소에 함께 전송하지 않는다. 즉, 태그는 서버에 별도로 푸시해야한다는 뜻이다.

태그를 푸시할 때는 레포지토리의 브랜치명인 master가 아닌 버전 이름으로 해줘야 한다.

$ git push origin v1.0

# 복수의 태그를 한번에 푸시할 경우
$ git push origin --tags

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 167 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:juliahwang/gitpractice.git
 * [new tag]         v1.0 -> v1.0
 * [new tag]         v1.0-lw -> v1.0-lw


공유된 태그정보는 아래 이미지의 releases 탭에서 확인할 수 있다.

tag1


태그 탭에서는 태그기록을 확인할 수 있으며, 배포버전으로 내보내거나 릴리즈 노트를 저장할 수 있다.

tag2


원격 저장소를 clone, pull할 경우

당연한 말이지만 태그정보도 함께 받을 수 있다.



Julia Hwang

디발자를 꿈꾸는 웹개발자의 블로그입니다.