브랜치(branch)는 커밋을 만들 때마다 자동으로 최신 커밋을 따라 움직이는 포인터입니다. 태그(tag)는 만드는 순간 가리킨 커밋에 고정되고, 이후 커밋과 상관없이 그대로 남습니다.
| 종류 | 명령 | 저장 정보 | 용도 |
|---|---|---|---|
| 경량 태그(lightweight) | git tag 이름 |
커밋 해시만 | 임시 표시 |
| 주석 태그(annotated) | git tag -a 이름 -m 메시지 |
작성자·날짜·메시지 | 배포용 |
경량 태그는 브랜치 파일 안에 커밋 해시 하나만 적어 둔 것과 같습니다. 배포 이력을 남겨야 하면 항상 주석 태그를 씁니다.
| 명령 | 동작 |
|---|---|
git tag / git tag -l |
전체 목록 |
git tag -l 'v1.*' |
패턴 필터 |
git tag -l -n1 이름 |
목록에 메시지 첫 줄 포함 |
git show 이름 |
태그(또는 커밋) 상세 |
show 는 주석 태그면 태거·날짜·메시지를 먼저 보여주고 그 아래에 가리키는 커밋을 보여줍니다. 경량 태그면 커밋 내용만 바로 나옵니다.
| 명령 | 동작 |
|---|---|
git tag -d 이름 |
로컬 태그 삭제 |
git tag 이름 커밋해시 |
과거 커밋에 태그 |
git tag -f 이름 대상 |
태그를 다른 커밋으로 강제 이동 |
-f 로 옮기기는 아직 아무에게도 공유하지 않은 태그에만 씁니다. 이미 push 한 태그를 옮기면 동료의 로컬 태그와 가리키는 커밋이 달라집니다.
| 명령 | 브랜치 전송 | 태그 전송 |
|---|---|---|
git push origin main |
O | X |
git push origin v1.1.0 |
X | 지정 태그(및 도달 가능한 태그) |
git push --tags origin |
X | 전체 태그 |
git push --follow-tags origin main |
O | 도달 가능한 주석 태그 |
git config push.followTags true 를 설정하면 git push 마다 --follow-tags 를 붙인 것과 같이 동작합니다. 경량 태그는 이 옵션으로도 전송되지 않고 주석 태그만 대상입니다.
유의적 버전(Semantic Versioning)은 MAJOR.MINOR.PATCH 세 자리로 변경 폭을 알리는 규칙입니다.
| 자리 | 올리는 상황 |
|---|---|
| MAJOR | 호환이 깨지는 변경 |
| MINOR | 기능 추가(호환 유지) |
| PATCH | 버그 수정만 |
버전만 보고도 "이번 업데이트를 그냥 받아도 되는지" 를 판단할 수 있게 하는 것이 목적입니다.
v1.2.0-rc.1 처럼 하이픈 뒤에 붙은 부분은 사전 릴리스(pre-release) 표시입니다. 정식 배포 전 검증용 버전임을 나타내고, 우선순위는 1.2.0-rc.1 < 1.2.0 순입니다.
+ 뒤에 붙은 부분은 빌드 메타데이터로, v1.2.0+20260105 처럼 씁니다. 버전 비교에는 영향을 주지 않고 참고 정보로만 씁니다.
메이븐(Maven) 프로젝트는 개발 중 버전 뒤에 -SNAPSHOT 을 붙입니다. 릴리스할 때만 그 표시를 떼고, 태그를 단 뒤 다시 다음 버전에 -SNAPSHOT 을 붙입니다.
1.1.0-SNAPSHOT (개발 중)
│ pom.xml 버전을 1.1.0 으로 확정, 커밋
▼
1.1.0 (릴리스 커밋) ──tag──> v1.1.0
│ pom.xml 버전을 1.2.0-SNAPSHOT 으로 올림
▼
1.2.0-SNAPSHOT (다음 개발)태그는 이 흐름에서 "SNAPSHOT 표시가 없는 그 한 커밋" 만 가리킵니다.
git describe --tags 는 현재 커밋에서 가장 가까운 조상 태그를 찾아 그 뒤에 거리를 붙여 보여줍니다.
| 조각 | 의미 |
|---|---|
v1.1.0 |
가장 가까운 조상 태그 |
-2 |
그 태그 이후 커밋 수 |
-g400dfcd |
현재 커밋의 짧은 해시(g는 git 표시) |
-dirty (옵션) |
커밋하지 않은 변경이 있음 |
--always 는 태그가 하나도 없을 때만 짧은 해시로 대체하는 옵션이라, 태그가 있으면 --tags 와 결과가 같습니다. --dirty 는 작업 트리에 변경이 남아 있으면 끝에 표시를 붙입니다.
git checkout 태그 를 하면 HEAD 가 브랜치가 아니라 커밋을 직접 가리키는 분리된 HEAD(detached HEAD) 상태가 됩니다. 배포본이 맞는지 파일만 확인하고 원래 브랜치로 돌아오면 안전합니다.
이 상태에서 커밋을 계속 쌓으면 어느 브랜치에도 속하지 않아 나중에 찾기 어렵습니다. 뭔가 고쳐야 한다면 checkout -b 로 새 브랜치를 만들고 시작합니다.
| 옵션 | 의미 |
|---|---|
--format=zip |
zip 으로 묶기(tar.gz 도 가능) |
--prefix=app-1.1.0/ |
압축 안 최상위 폴더 이름 |
-o 파일 |
결과 파일로 저장 |
git archive 는 .git 폴더 없이 지정한 태그 시점의 파일만 담습니다. zip 파일에는 원본 커밋 해시가 코멘트로 남아 나중에 어느 커밋에서 뽑았는지 확인할 수 있습니다.
git log 태그A..태그B --oneline 은 두 태그 사이 커밋만 보여주고, git shortlog -sn 은 작성자별 커밋 수를 집계합니다. 둘 다 릴리스 노트 초안으로 씁니다.
버전을 안정화하는 동안에는 release/1.2 같은 릴리스 브랜치를 따로 두고, 검증이 끝나면 그 위에서 태그를 답니다. 배포 후 급한 버그는 hotfix 브랜치를 태그에서 갈라 고치고 패치 버전만 올려 새 태그를 답니다.
서명 태그(git tag -s)는 GPG 서명이 붙는 주석 태그로, 배포본의 무결성을 검증할 때 씁니다.