[GIT] 깃(Git) 태그(tag) 사용하기 (ft. 조회/추가/변경/삭제)
git tag
git에는 tag를 줄 수 있는 기능이 존재하는데, 보통 릴리즈 버전을 관리하기 위해 사용된다.
릴리즈 할때마다 semantic versioning의 규칙에 따라 태킹을 하고는 한다.
(*semantic versioning은 가장 흔하게 버전을 관리할 때 사용하는 규칙이므로 알아두면 좋다.)
태그 조회하기
우선 git tag라는 명령어를 통해 이미 만들어진 태그가 있는지 확인할 수 있다.
$ git tag
v0.1
v1.3
이 명령어는 알파벳 순서로 태그를 보여주지만, 사실 순서는 그렇게 큰 의미는 없다.
그리고 검색 패턴을 사용하여 태그를 검색할 수 있는데,
tag 명령어에 -l 또는 --list 옵션 및 와일드카드(*) 패턴과 함께 사용하여 조건에 맞는 태그를 조회할 수 있다.
$ 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
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
단순히 모든 태크 목록을 조회하기 위해 git tag 명령을 실행했을 때 -l 또는 --list 옵션이 적용된 것과 동일한 결과가 출력되지만, 만약에 와일드카드(*) 패턴과 함께 태그 목록 조건 검색을 하는 경우에는 반드시 -l 또는 --list 옵션을 같이 사용해 줘야한다.
그리고 추가적으로 특정 태그에 대한 정보를 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
이는 단순히 커밋 정보만을 보여주는 것이지만, 만약에 태그가 Annotated 태그라면 태그 정보 역시 같이 출력된다.
$ 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
태그 추가하기
Git의 태그에는 Lightweight 태그와 Annotated 태그로 두 종류가 존재한다.
Lightweight 태그는 단순히 특정 커밋에 대한 포인터의 역할로 버전 같은 태그 이름을 남기는 데 사용된다.
Annotated 태그는 Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜 그리고 태그 메시지를 따로 저장해둔다. 그리고 GPG(GNU Privacy Guard)로 서명할 수도 있다.
그렇기 때문에 보통 Annotated 태그를 만들어 이 모든 정보를 사용할 수 있도록 하는 것이 좋으나, 임시로 생성하는 태그 거나 이러한 정보를 유지할 필요가 없는 경우에는 Lightweight 태그를 사용하기도 한다.
Lightweight 태그 생성
Lightweight 태그는 기본적으로 파일에 커밋 체크섬을 저장하는 것뿐이라 이름만 달아주면 된다.
# git tag <TAG NAME>
$ git tag v1.0.0
$ git tag
v1.0.0
아래 이미지를 보면 태그 생성과 함께 현재 HEAD에 태그가 달린 것을 확인할 수 있다.
Annotated 태그 생성
Annotated 태그를 만드는 방법은 매우 간단한데, tag -a 옵션을 사용하면 된다.
그리고 Annotated 태그는 메시지를 남길 수 있기 때문에 -m 옵션 역시 같이 사용하여 태킹과 동시에 메시지를 입력한다.
# git tag -a <TAG NAME> -m "<TAG MESSAGE>"
$ git tag -a v1.4 -m "my version 1.4"
나중에 태그 하기 (특정 커밋 선택 태그)
이전 히스토리를 검색해서 이전 커밋에 대해 태그를 지정할 수 있다.
로그 좌측에 고유 번호가 존재하는데, 저 긴 번호를 전부 사용할 필요는 없고 일부분만 사용해줘도 된다.
# Lightweight 태그
# git tag <TAG NAME> <HASH>
$ git tag v1 b7ee023
# Annotated 태그
# git tag -a <TAG NAME> <HASH>
$ git tag -a v1 b7ee023
기존 태그의 대상 commit 바꾸기
기존 태그가 포인팅 하고 있는 commit의 위치를 바꾸고자 한다면 -f 옵션을 사용하면 된다.
# git tag <TAG NAME> <HASH> -f
git tag v1.0.0 9b8e0d9 -f
태그 삭제하기
# git tag -d <TAG NAME>
$ git tag -d v1
태그 변경하기
Lightweight 태그 변경
# git tag <NEW TAG NAME> <OLD TAG NAME>
$ git tag v1.0 v1
# git tag -d <OLD TAG NAME>
$ git tag -d v1
왜 태그를 수정하는데, 삭제 명령어가 같이 있는지 의문일 수 있다.
첫 번째 명령어처럼 git tag v1.0 v1을 하고 나서 log를 살펴보면 기존에 v1 태그가 있는 부분에 v1.0이 추가되어 있는 것을 볼 수 있는데, 이는 수정이라기보다는 같은 위치에 새로운 태그를 넣었다고 보는 게 맞다.
그래서 수정보다는 변경이라고 말하는 것이다.
그렇기 때문에 기존에 존재하던 태그를 지워줘야 다른 태그로 변경이 완료되는 것이다.
Annotated 태그 변경
$ git show-ref --tags --dereference
4881322eec6aa8fe5a05893c523ddc3daa4e95b2 refs/tags/v1.4
2f95b0aed02456c61042b52d11d796c8b8e7f34f refs/tags/v1.4^{}
# git tag -a <NEW TAG NAME> <HASH> -m "<NEW MESSAGE>"
$ git tag -a v1.3.0 2f95b0a -m "<NEW TAG MESSAGE>"
# git tag -d <OLD TAG NAME>
$ git tag -d v1.4
이것 역시도 Lightweight 태그 수정과 동일하다 수정이 아니라 변경 생각하면 된다.
해당 해시의 태그를 다른 태그로 변경하고 원래 있던 태그를 삭제해주면 된다.
태그 원격 저장소에 push 하기
git push 명령은 자동으로 원격 서버에 태그를 전송하지 않는다.
그렇기 때문에 태그를 만들었다면 서버에 별도로 push를 해줘야 한다.
# git push <REMOTE> <TAG NAME>
git push origin v1.0.0
# git push <REMOTE> --tags
git push origin --tags
태그를 하나하나 push 할 수 있고, --tags 옵션을 통해 모든 tag들을 서버로 전송할 수 있다.
이렇게 하면 누군가 저장소에서 Clone 하거나 Pull을 하면 모든 태그 정보도 함께 전송된다.
원격 저장소 태그 조회
$ git ls-remote --tags
원격 저장소 태그 삭제
$ git push <REMOTE> :refs/tags/<TAG NAME>
$ git push <REMOTE> :<TAG NAME>
$ git push <REMOTE> -d <TAG NAME>
참고: https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%ED%83%9C%EA%B7%B8