...
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
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.