Git Tag

Git Tag

Git Tag 는 특정 커밋에 "이름표(태그)"를 붙이는 기능입니다.

일반적으로 릴리스 버전 관리(예: v1.0.0, v2.1.3)를 위해 사용되며, git tag로 생성된 태그는 특정 커밋을 변하지 않는 참조(immutable reference)로 고정해 줍니다.

Git Tag 의 종류

Annotated 태그

  • 태그를 만든 사람의 이름, 이메일, 태그 생성일, 태그 메시지를 저장한다.
  • 일반적으로는 Annotated 태그를 사용하는 게 권장된다.

Lightweight 태그

  • 단순히 특정 커밋에 대한 포인터로, 특정 커밋을 가리키는 역할만 한다.
  • Annotated 와 같은 태그에 대한 메타데이터를 저장하지 않는다.
  • Lightweight 태그는 임시로 사용하거나, 정보 저장이 필요 없을 때 사용.

Git Tag 만들기

Annotated 태그

  • git tag -a <태그명> 와 같이 -a 옵션을 추가하면 annotated 태그가 생성된다.
  • -m 옵션을 같이 사용하면 태그에 대한 메시지도 추가할 수 있다.
1
git tag -a v1.4 -m "my version 1.4"

Lightweight 태그

  • 별도 옵션 없이 git tag <태그명> 명령어를 사용한다.
  • -a, -m, -s 와 같은 옵션은 사용하지 않는다.
1
git tag v1.4-lw

Tag 를 원격 저장소에 전송하기

  • git push 명령은 원격 저장소에 태그를 전송하지는 않는다.
  • 따라서 Tag 를 원격 저장소에 전송하기 위해서는 git push origin <태그이름> 명령어를 추가로 실행해줘야 한다.
1
git push origin <태그이름>
  • 만약 한 번에 여러 태그를 Push 하고자 할 경우 --tags 옵션을 사용한다.
1
git push origin --tags

Tag 삭제

로컬 저장소의 Tag 삭제

  • 로컬 저장소의 태그를 삭제할 때에는 -d 옵션 (--delete 와 동일) 을 사용한다.
1
git tag -d v1.4-lw

원격 저장소의 Tag 삭제

  • 원격 저장소의 태그를 삭제할 때에는 아래 세 가지 명령어를 적용할 수 있다.
1
2
3
git push origin -d <태그이름>
git push origin :<태그이름>
git push origin :refs/tags/<태그이름>

원격 저장소 Tag 삭제가 안될 때

원격 저장소 Tag 삭제 명령어를 실행했는데, 아래와 같은 오류메시지가 출력되며 삭제가 되지 않는 경우가 있습니다.

1
2
3
4
remote: GitLab: You can only delete protected tags using the web interface.
To http://mygitlab.org/some_repo/project.git
 ! [remote rejected] some_tag (pre-receive hook declined)
error: failed to push some refs to 'http://mygitlab/some_repo/project.git'

에러메시지를 보면 알 수 있듯, protected tagweb interface 를 사용해서만 제거할 수가 있습니다. CLI 나 API를 통해서는 삭제할 수 없는 것입니다.

두 가지 해결책이 있는데, 상황에 맞춰 진행하면 되겠습니다.

  • 첫 번째, 에러메시지에서 권장한대로 web interface 에서 삭제
  • 두 번째, 태그의 protect 를 해제하고 CLI 등으로 삭제

Git Tag 명령어

명령어 설명
git tag 로컬 저장소에 있는 깃 태그 목록을 조회한다.
git ls-remote --tags 원격 저장소에 있는 깃 태그 목록을 조회한다.
git show 깃 태그에 대한 메타데이터와 커밋 정보를 조회한다.
git tag -a <태그명> 현재 커밋에 annotated 깃 태그를 생성한다. (로컬)
git tag <태그명> 현재 커밋에 lightweigh 깃 태그를 생성한다. (로컬)
git push origin <태그명> 원격 저장소에 지정 태그를 푸시한다.
git push origin --tags 원격 저장소에 푸시되지 않은 모든 태그를 푸시한다.
git tag -d <태그명> 로컬에서 지정 태그를 삭제한다.
git push origin -d <태그이름> 원격 저장소에서 지정 태그를 삭제한다.
git push origin :<태그이름> 원격 저장소에서 지정 태그를 삭제한다.
git push origin :refs/tags/<태그이름> 원격 저장소에서 지정 태그를 삭제한다.

Reference

https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%ED%83%9C%EA%B7%B8
https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-%ED%83%9C%EA%B7%B8-%EA%B8%B0%EB%8A%A5-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95-tag

Comments