본문 바로가기
C.W.K.
Stream
Lesson 05 of 05 · published

Tag와 release history

~16 min · tag, release

Level 0추적 전 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

Tag는 한 순간을 고정하고 release는 metadata를 더해

Branch는 움직이지만 tag는 움직이지 않아. Tag는 특정 commit에 붙인 이름이고 한 번 정하면 pointer가 영원히 바뀌지 않아. 대표적인 용도는 release야. ship한 commit에 v2.4.0 tag를 붙이면 누구나 나중에 git checkout v2.4.0으로 정확히 그 운영 release 자리로 갈 수 있어. 고객이 'v2.3.7에서' bug를 재현했다고 할 때 몇 초 안에 같은 상태를 열 수 있지.

중요한 type은 둘이야. Lightweight tag(git tag v2.4.0)는 metadata 없는 pointer file이고, annotated tag(git tag -a v2.4.0 -m "Release 2.4.0")는 author, 날짜, message, 선택적인 GPG 서명을 가진 온전한 Git object야. 실제 release에는 annotated tag를 써. 서명은 권한 있는 사람이 만든 release인지 확인하고 message는 audit trail이 되며, git describev2.4.0-12-g3f4a5d6처럼 사람이 읽을 수 있는 commit ID를 만들어.

git push --tags는 tag를 remote로 보내. plain git push에는 tag가 포함되지 않는다는 점을 놓치기 쉬워. git config --global push.followTags true를 두면 push하는 commit을 가리키는 tag가 일반 push를 따라가. git tag -d <name>은 로컬 tag를, git push origin --delete <name>은 remote tag를 지워. 다만 remote tag 삭제는 거의 옳지 않아. 이미 fetch한 사람의 머신에는 여전히 남기 때문이야.

GitHub Releases는 annotated tag에 UI를 더해 release note, tarball이나 binary 같은 asset, pre-release 표시를 제공해. CLI에서는 gh release create v2.4.0 --notes "..."로 만들 수 있고 tag를 push한 뒤 web UI를 써도 돼. semantic-release와 Conventional Commits를 결합하면 release가 merge의 자동 결과가 되어 사람이 매번 release note를 쓰지 않아도 돼.

Code

Release 용 annotated tag·bash
# HEAD 에 annotated, signed tag:
git tag -a v2.4.0 -m "Release 2.4.0 — OAuth2 GitHub login" -s

# 특정 commit 에:
git tag -a v2.4.0 abc1234 -m "..."

# Tag list:
git tag --list 'v2.*'             # glob 필터

# Tag metadata 보기:
git show v2.4.0

# Tag push (plain git push 로는 안 됨):
git push origin v2.4.0
git push --tags                   # 모든 tag

# 같은 tip 가리키는 tag 가 일반 push 따라오게:
git config --global push.followTags true
gh 통한 GitHub Releases·bash
# Tag + GitHub release 한 번에:
gh release create v2.4.0 \
  --title "v2.4.0 — OAuth2 GitHub login" \
  --notes-file CHANGELOG-2.4.0.md \
  --target main

# Build 산출물 첨부:
gh release upload v2.4.0 dist/myapp-2.4.0.tar.gz

# Pre-release 표시:
gh release create v2.5.0-beta.1 --prerelease --generate-notes

# git describe — 가장 최근 tag + offset:
git describe --tags
# 출력 예: v2.4.0-12-g3f4a5d6
# v2.4.0 후 12 commit, 현재 short hash 3f4a5d6 의미

External links

Exercise

실제 repo의 HEAD에 의미 있는 message로 annotated tag 하나를 만들고 git push origin <tag>로 올려. GitHub의 Releases 또는 Tags에 보이는지 확인하고 git describe --tags의 출력 형식을 읽어. global push.followTags = true도 설정해. 가능하다면 과거 이력에서 뒤늦게라도 tag할 가치가 있는 순간 하나를 적어봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.