git Tag 추가 변경 삭제

Git 의 Tag 는 깃 레포지토리에서 특정 객체를 가리키는 역할을 합니다.
보통 소스의 버전을 관리하는 데 많이 사용됩니다.

태그 조회

tag 명령어를 이용하여 현재 로컬 저장소의 모든 태그를 조회할 수 있습니다

1
2
3
4
5
6
> git tag

v0.1.0
v0.1.1
v0.2.0
...

tag 명령어에 -l 또는 --list 옵션 및 와일드카드(*) 패턴과 함께 사용하여 조건에 맞는 태그를 조회할 수 있습니다.

1
2
3
4
> git tag --list "v0.1.*"

v0.1.0
v0.1.1

show-ref 명령어를 --tags 옵션과 함께 태그 리스트를 조회할 수 있습니다.

1
2
3
4
5
6
> git show-ref --tags
cdcdccd2bed17212a41eed92c4afc3b9432cdee4 refs/tags/list
c4a63e238b4176103532563b270c374602488275 refs/tags/v1.0.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.0
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0
...

show 명령어를 사용하여 특정 태그에 대한 정보를 조회할 수 있습니다.

1
> git show v0.1.0

태그 생성

lightweightannotated 두 종류의 태그를 지원합니다.

  • Lightweight : 특정 커밋을 가르키는 역활을 합니다. (포인터 역할)
  • Annotated : 만든 사람, 이메일, 날짜, 메시지를 객체로 저장합니다 그리고 GPG(GNU Privacy Guard)로 서명할수 있습니다.

Lightweight 태그 생성

-a, -s, -m 중 아무 옵션도 지정하지 않으면 lightweight 태그를 생성할 수 있습니다.
lightweight 태그에는 어떠한 추가적인 정보도 저장할 수 없습니다.

1
> git tag <TAG NAME>

Annotated 태그 생성

tag 명령어를 -a 옵션과 함께 사용하여 annotated 태그를 생성할 수 있습니다.

1
> git tag -a <TAG NAME> -m "<TAG MESSAGE>"

특정 커밋을 지정하여 태그를 만들려면 커맨드 맨 뒤에 COMMIT CHECKSUM 를 지정합니다

1
2
3
> git tag -a <TAG NAME> <COMMIT CHECKSUM>

git tag -a v0.1.0 322b42f

annotated 태그는 태그 정보와 커밋 정보를 함께 보여주지만, lightweight 태그는 태그에 대한 정보를 저장할 수 없기 때문에 가리키고 있는 커밋에 대한 정보만 보여준다

태그 조회 (lightweight vs annotated)

show-ref 명령어를 --tags --dereference 옵션과 함께 태그의 원본 커밋객체까지 조회가 가능합니다

1
2
3
4
5
6
7
> git show-ref --tags --dereference
cdcdccd2bed17212a41eed92c4afc3b9432cdee4 refs/tags/list
c4a63e238b4176103532563b270c374602488275 refs/tags/v1.0.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.0
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0
88c34a1ca247851f721738e36ca4228cf8b0724c refs/tags/v1.2.0^{}
...

--dereference 옵션 을 사용하면 annotated 태그가 v1.2.0 가 가르키고 있는 v1.2.0^{} 객체도 조회가 가능하다.

위의 태그 리스트에서 v1.2.0 만 태그 객체이다. 나머지는 태그가 가르키는 원복 객체의 COMMIT CHECKSUM 정보이다

1
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0

태그 삭제

로컬 저장소의 태그를 삭제하려면 -d 또는 --delete 옵션을 사용한다

1
> git tag -d v0.1.0

태그 수정

lightweight 태그 수정

1
2
> git tag <NEW TAG NAME> <OLD TAG NAME>
> git tag -d <OLD TAG NAME>
1
2
3
4
5
6
7
8
9
10
11
12
> git show-ref --tags --dereference
c4a63e238b4176103532563b270c374602488275 refs/tags/v1.0.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.0

> git tag v1.1.1 v1.1.0

> git show-ref --tags --dereference
c4a63e238b4176103532563b270c374602488275 refs/tags/v1.0.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.0
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.1

> git tag -d v1.1.0

annotated 태그 수정

1
2
> git tag -a <NEW TAG NAME> <OLD TAG NAME>^{} -m "<NEW TAG MESSAGE>"
> git tag -d <OLD TAG NAME>

<OLD TAG NAME>^{} 는 OLD TAG 가 가르키는 객체의 COMMIT CHECKSUM 정보이다.

1
2
3
4
5
6
7
8
9
10
> git show-ref --tags --dereference
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0
88c34a1ca247851f721738e36ca4228cf8b0724c refs/tags/v1.2.0^{}

> 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 tag -d v1.2.0

원격 저장소의 태그 조회

1
> git ls-remote --tags

원격 저장소에 태그 푸시

원격 저장소에 태그는 별도로 push 해야 합니다.

1
2
3
4
5
6
> git push <REMOTE> <TAG NAME>

> git push origin v1.0.0
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/skyksit/blog.git
* [new tag] v1.0.0 -> v1.0.0

--tags 옵션을 이용하여 전체 태그를 한 번에 푸시할 수 있습니다

1
2
3
4
5
6
7
8
9
10
git push origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 176 bytes | 88.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/skyksit/blog.git
* [new tag] list -> list
* [new tag] v1.1.0 -> v1.1.0
* [new tag] v1.1.1 -> v1.1.1
* [new tag] v1.2.0 -> v1.2.0

--follow-tags 옵션으로 commit 과 tag 를 동시에 push 할 수 있습니다

1
> git push --follow-tags

원격 저장소 태그 삭제

태그 삭제에는 3가지 명령어를 다 사용 가능합니다

1
2
3
> git push <REMOTE> :refs/tags/<TAG NAME>
> git push <REMOTE> :<TAG NAME>
> git push <REMOTE> -d <TAG NAME>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
> git ls-remote --tags
From https://github.com/skyksit/blog.git
cdcdccd2bed17212a41eed92c4afc3b9432cdee4 refs/tags/list
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 origin :refs/tags/list
To https://github.com/skyksit/blog.git
- [deleted] list

> git push origin :v1.0.0
To https://github.com/skyksit/blog.git
- [deleted] v1.0.0

> git push origin -d v1.1.0
To https://github.com/skyksit/blog.git
- [deleted] v1.1.0

> git ls-remote --tags
From https://github.com/skyksit/blog.git
2b35cb048ebaca097fd0b8761a16fc4cc2c0eb1b refs/tags/v1.1.1
37c606d7a2d7390649748ec8acd76cd07876c2eb refs/tags/v1.2.0
88c34a1ca247851f721738e36ca4228cf8b0724c refs/tags/v1.2.0^{}

연관포스트