Git Tag로 버전 관리와 릴리스를 쉽게
개요
Git은 버전 관리 시스템으로 소프트웨어 개발에 필수적인 도구입니다. 그중에서도 Git Tag는 특정 커밋을 참조하고 버전을 관리하는 데 유용한 기능입니다. 이번 포스트에서는 Git Tag를 사용하여 버전 관리와 릴리스 관리를 어떻게 쉽게 할 수 있는지 알아보겠습니다.
Git Tag
Git Tag는 특정 커밋을 쉽게 참조하기 위한 버전 관리 도구입니다. 주로 릴리스 버전을 기록하거나, 중요한 커밋을 표식하는 데 사용됩니다.
Git에서 tag는 이름을 붙여 커밋을 참조할 수 있도록 해주며, 이로 인해 프로젝트의 버전 관리가 용이해집니다. branch와 달리 변경되지 않는 참조이므로, 프로젝트의 중요한 지점(예: 릴리스, 안정된 버전)을 표시하는 데 이상적입니다.
Git Tag, Branch 비교
Git에서 Tag와 Branch는 모두 커밋을 참조하는 역할을 합니다.
Git Tag | Git Branch | |
참조하는 커밋 | 고정된 커밋(commit_id) | 최신 커밋 (checkout 시 변경됨) |
특징 | 변경되지 않는 참조 | 최신 커밋을 추적하는 작업 중인 포인터, 결합 및 병합 가능 (merge) |
변경 가능성 | 변경되지 않음 (고정) | 브랜치 이동 시 최신 커밋을 가리킴 |
주요 사용 용도 | 버전 관리, 릴리스 관리, 안정된 지점 참조 | 기능 개발, 버그 수정 등 병렬 작업 |
커밋 포인터 | 특정 커밋을 가리킴 (고정) | 브랜치가 커밋을 가리킴 (변경 가능) |
사용 예시 | git tag v1.0.0 (특정 커밋을 고정하여 버전 관리) | git checkout feature/login-page (브랜치 변경) |
Git Tag 종류
Lightweight Tag
가장 기본적인 형태의 태그로, 실제 커밋에 대한 참조만 포함됩니다. 추가적인 메타데이터나 메시지가 포함되지 않습니다.
git tag <tag-name>
Annotated Tag
메시지와 태그 작성자의 정보, 날짜 등을 포함한 태그입니다. 일반적으로 릴리스를 기록할 때 사용됩니다.
git tag -a <tag-name> -m "태그 메시지"
Git Tag CLI
태그 목록 조회
$ git tag
태그 조건 검색
l 또는 --list 옵션 및 와일드카드(*) 패턴 활용하여 태그명 기준의 검색 조건을 줄 수 있습니다.
$ git tag -l {태그 이름}
$ git tag -l v1.1.*
태그 상세 조회
$ git show {태그 이름}
태그 생성
Lightweight 태그를 지정할 때 태그 이름 뒤에 커밋 ID(체크섬)를 명시하지 않으면, 현재 HEAD가 가리키는 최신 커밋에 태그가 붙습니다
$ git tag <태그명>
$ git tag v1.0.0
특정 커밋에 태그를 달 수도 있습니다. 커밋 ID는 축약된 6~7자리만 사용해도 됩니다.
git tag v1.0.1 <commit-hash>
Annotated Tag를 생성하려면, git tag 명령어를 사용하여 태그에 작성자, 이메일, 작성 날짜, 그리고 메시지를 포함할 수 있습니다.
$ git tag -a 태그명 [커밋체크섬] // -a 옵션 추가 (Annotated태그)
$ git tag -a 태그명 -m "태그메시지" [커밋체크섬]
태그 삭제
로컬에서 태그를 삭제하려면 아래 명령어를 사용합니다.
$ git tag -d 태그명
원격 저장소와 Git Tag
git push는 자동으로 태그를 원격 저장소에 전송하지 않습니다. 따라서, 태그를 push하려면 별도로 명령어를 입력해야 합니다. --tags 옵션을 사용하면 로컬의 모든 태그를 한 번에 push할 수 있습니다. 또한, git pull이나 git clone을 통해 데이터를 받을 때는 원격 저장소의 태그도 자동으로 함께 받아집니다.
원격저장소 태그 조회
$ git ls-remote --tags
원격저장소 태그 생성
// 로컬에서 생성한 태그를 원격 저장소에 푸시
$ git push 저장소명 태그명
// 로컬에서 생성한 모든 태그를 원격 저장소로 푸시
$ git push 저장소명 --tags
원격 저장소 태그를삭제
git push origin --delete tag <tag-name>