개발이 취미인 사람

[Git] - Git Tag - 버전 관리 및 릴리즈 본문

컴퓨터공학/Git

[Git] - Git Tag - 버전 관리 및 릴리즈

RyanSin 2025. 12. 27. 20:00
반응형

개요

안녕하세요. 이번 시간에는 Git Tag에 대해 알아보겠습니다. Tag는 특정 커밋에 버전을 표시하는 기능으로, 소프트웨어 릴리즈 관리에 필수적입니다. v1.0.0, v2.1.0과 같은 버전 번호를 Git으로 관리하는 방법을 배워보겠습니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.

 

[Git] - Git Stash - 임시 저장 활용법

- Tag란?

Tag는 Git의 특정 커밋에 대한 **참조(reference)**입니다. 주로 릴리즈 버전을 표시하는 데 사용됩니다.

Tag의 용도

✅ 주요 용도:
- 릴리즈 버전 표시 (v1.0.0, v2.1.0)
- 특정 시점의 코드 스냅샷 저장
- 배포 이력 관리
- 다운로드 가능한 릴리즈 생성

💡 예시:
v1.0.0 → 첫 번째 정식 릴리즈
v1.1.0 → 새 기능이 추가된 마이너 업데이트
v1.1.1 → 버그 수정 패치

Tag의 특징

1. 특정 커밋을 가리킴 (브랜치와 유사)
2. 한번 만들면 이동하지 않음 (브랜치와 다름)
3. 원격 저장소와 공유 가능
4. GitHub에서 자동으로 릴리즈 페이지 생성

브랜치 vs Tag

항목브랜치Tag

 

이동 새 커밋 생성 시 이동 고정 (이동 안함)
용도 개발 작업 버전 표시
수정 자주 수정됨 거의 수정 안함
예시 main, develop v1.0.0, v2.0.0

- Tag의 종류

Git에는 두 가지 종류의 Tag가 있습니다.

1. Lightweight Tag (가벼운 태그)

단순히 특정 커밋을 가리키는 포인터입니다.

 
bash
# Lightweight Tag 생성
git tag v1.0.0

# 특정 커밋에 Tag 생성
git tag v1.0.0 a1b2c3d

특징:

  • 태그 이름만 저장
  • 추가 정보 없음
  • 빠르고 간단
  • 임시 태그나 개인용으로 사용

2. Annotated Tag (주석 태그) - 권장

태그 작성자, 날짜, 메시지 등의 정보를 포함하는 완전한 객체입니다.

 
bash
# Annotated Tag 생성
git tag -a v1.0.0 -m "첫 번째 정식 릴리즈"

# 특정 커밋에 Tag 생성
git tag -a v1.0.0 a1b2c3d -m "메시지"

특징:

  • 태그 작성자 정보 저장
  • 태그 생성 날짜 저장
  • 태그 메시지 저장
  • GPG 서명 가능
  • 공식 릴리즈에 권장

Lightweight vs Annotated 비교

항목LightweightAnnotated
생성 git tag v1.0.0 git tag -a v1.0.0 -m "메시지"
정보 커밋만 가리킴 작성자, 날짜, 메시지 포함
사용 임시 태그 공식 릴리즈
권장도 낮음 높음 (권장)

💡 권장: 공식 릴리즈는 항상 Annotated Tag를 사용하세요!

- Tag 생성하기

현재 커밋에 Tag 생성

bash
# Annotated Tag 생성 (권장)
git tag -a v1.0.0 -m "첫 번째 정식 릴리즈"

# Lightweight Tag 생성
git tag v1.0.0

# 긴 메시지로 Tag 생성 (에디터 열림)
git tag -a v1.0.0
# 에디터에서 메시지 작성 후 저장

과거 커밋에 Tag 생성

bash
# 커밋 히스토리 확인
git log --oneline

# 출력
a1b2c3d feat: 사용자 인증 기능 추가
b2c3d4e fix: 로그인 버그 수정
c3d4e5f init: 프로젝트 초기 설정

# 특정 커밋에 Tag 생성
git tag -a v1.0.0 a1b2c3d -m "사용자 인증 기능 릴리즈"

실전 예시

 
 
bash
# === 시나리오: v1.0.0 릴리즈 ===

# 1. 현재 상태 확인
git log --oneline -5

# 2. 최종 커밋에 Tag 생성
git tag -a v1.0.0 -m "Release v1.0.0

주요 기능:
- 사용자 인증 (로그인/회원가입)
- 프로필 관리
- 대시보드

버그 수정:
- 로그인 세션 만료 이슈 수정
- UI 반응형 개선"

# 3. Tag 확인
git tag
# v1.0.0

# 4. Tag 상세 정보 확인
git show v1.0.0

- Tag 확인하기

Tag 목록 보기

 
 
bash
# 모든 Tag 목록
git tag

# 출력
v1.0.0
v1.1.0
v1.1.1
v2.0.0

# 알파벳 순서로 정렬
git tag --sort=v:refname

# 패턴으로 검색
git tag -l "v1.*"
# v1.0.0
# v1.1.0
# v1.1.1

git tag -l "v2.*"
# v2.0.0

Tag 정보 상세 보기

 
 
bash
# Annotated Tag 정보 보기
git show v1.0.0

# 출력
tag v1.0.0
Tagger: RyanSin <ryan@example.com>
Date:   Mon Dec 16 10:00:00 2024 +0900

첫 번째 정식 릴리즈

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
...

# 간단하게 보기
git tag -n
# v1.0.0    첫 번째 정식 릴리즈
# v1.1.0    새 기능 추가

# 여러 줄 메시지 보기
git tag -n5

Tag가 가리키는 커밋 확인

 
 
bash
# Tag의 커밋 해시 확인
git rev-parse v1.0.0

# 출력
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0

# Tag와 커밋 함께 보기
git log --oneline --decorate

# 출력
a1b2c3d (HEAD -> main, tag: v1.0.0) feat: 인증 기능 추가
b2c3d4e fix: 버그 수정

- Tag 삭제하기

로컬 Tag 삭제

 
 
bash
# 로컬 Tag 삭제
git tag -d v1.0.0

# 출력
Deleted tag 'v1.0.0' (was a1b2c3d)

# 여러 Tag 삭제
git tag -d v1.0.0 v1.1.0 v1.1.1

원격 Tag 삭제

 
 
bash
# 원격 저장소의 Tag 삭제
git push origin --delete v1.0.0

# 또는
git push origin :refs/tags/v1.0.0

# 여러 Tag 삭제
git push origin --delete v1.0.0 v1.1.0

Tag 수정하기

Tag는 한번 만들면 수정할 수 없습니다. 삭제 후 다시 만들어야 합니다.

 
 
bash
# 잘못된 Tag 삭제
git tag -d v1.0.0

# 올바른 Tag 재생성
git tag -a v1.0.0 -m "수정된 메시지"

# 원격에 강제 푸시
git push origin v1.0.0 --force

⚠️ 주의: 이미 공개된 Tag를 수정하면 다른 사람들에게 혼란을 줄 수 있습니다!

- Tag 원격 저장소에 푸시하기

Tag는 git push로 자동으로 전송되지 않습니다. 명시적으로 푸시해야 합니다.

특정 Tag 푸시

 
 
bash
# 특정 Tag 하나 푸시
git push origin v1.0.0

# 출력
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/username/repo.git
 * [new tag]         v1.0.0 -> v1.0.0

모든 Tag 푸시

 
 
bash
# 모든 Tag 한번에 푸시
git push origin --tags

# 출력
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/username/repo.git
 * [new tag]         v1.0.0 -> v1.0.0
 * [new tag]         v1.1.0 -> v1.1.0
 * [new tag]         v2.0.0 -> v2.0.0

Annotated Tag만 푸시

 
 
bash
# Annotated Tag만 푸시 (Lightweight 제외)
git push origin --follow-tags

실전 워크플로우

 
 
bash
# === 릴리즈 배포 과정 ===

# 1. 최종 커밋 완료
git add .
git commit -m "chore: v1.0.0 릴리즈 준비"

# 2. Tag 생성
git tag -a v1.0.0 -m "Release v1.0.0"

# 3. main 브랜치 푸시
git push origin main

# 4. Tag 푸시
git push origin v1.0.0

# 또는 한번에
git push origin main --follow-tags

- Tag로 체크아웃하기

Tag로 이동 (읽기 전용)

bash
# Tag로 체크아웃
git checkout v1.0.0

# 경고 메시지
Note: checking out 'v1.0.0'.
You are in 'detached HEAD' state...

# 이 상태에서는 읽기만 가능
# 커밋은 가능하지만 저장되지 않음

Tag 기반으로 브랜치 생성

bash
# Tag를 기반으로 새 브랜치 생성
git checkout -b hotfix-v1.0.1 v1.0.0

# 이제 이 브랜치에서 작업 가능
# ... 버그 수정 ...
git add .
git commit -m "fix: 긴급 버그 수정"

# 새 Tag 생성
git tag -a v1.0.1 -m "핫픽스 릴리즈"
git push origin hotfix-v1.0.1
git push origin v1.0.1

특정 Tag의 코드 확인

bash
# Tag의 파일 보기
git show v1.0.0:src/app.js

# Tag 시점의 전체 파일 목록
git ls-tree -r v1.0.0 --name-only

# Tag 시점의 코드 비교
git diff v1.0.0 v2.0.0

- Semantic Versioning (유의적 버전)

SemVer 규칙

버전 번호는 MAJOR.MINOR.PATCH 형식을 따릅니다.

버전 형식: v주버전.부버전.수버전

예시: v2.4.1
      ↑ ↑ ↑
      │ │ └─ PATCH: 버그 수정 (2.4.0 → 2.4.1)
      │ └─── MINOR: 기능 추가 (2.3.0 → 2.4.0)
      └───── MAJOR: 호환성 없는 변경 (1.x.x → 2.0.0)

버전 증가 규칙

버전증가 시점예시
MAJOR 기존 API와 호환되지 않는 변경 v1.5.3 → v2.0.0
MINOR 하위 호환되는 새 기능 추가 v1.5.3 → v1.6.0
PATCH 하위 호환되는 버그 수정 v1.5.3 → v1.5.4

버전 번호 예시

bash
# 첫 번째 개발 버전
v0.1.0   # 개발 초기

# 베타 버전
v0.9.0   # 거의 완성
v0.9.1   # 베타 버그 수정

# 첫 정식 릴리즈
v1.0.0   # 정식 출시!

# 버그 수정
v1.0.1   # 긴급 버그 수정
v1.0.2   # 추가 버그 수정

# 새 기능 추가
v1.1.0   # 사용자 알림 기능 추가
v1.2.0   # 검색 기능 추가

# 큰 변경
v2.0.0   # 전체 UI 개편 (호환성 깨짐)
v2.0.1   # 버그 수정
v2.1.0   # 새 기능 추가

Pre-release 버전

bash
# 알파 버전 (내부 테스트)
v1.0.0-alpha
v1.0.0-alpha.1

# 베타 버전 (공개 테스트)
v1.0.0-beta
v1.0.0-beta.1
v1.0.0-beta.2

# RC (Release Candidate)
v1.0.0-rc.1
v1.0.0-rc.2

# 정식 릴리즈
v1.0.0

실전 버전 관리 예시

bash
# 프로젝트 시작
git tag -a v0.1.0 -m "초기 개발 버전"

# 기능 추가
git tag -a v0.2.0 -m "로그인 기능 추가"
git tag -a v0.3.0 -m "프로필 기능 추가"

# 베타 테스트
git tag -a v0.9.0-beta -m "베타 버전"
git tag -a v0.9.1-beta -m "베타 버그 수정"

# 정식 출시
git tag -a v1.0.0 -m "정식 출시!"

# 버그 수정
git tag -a v1.0.1 -m "로그인 버그 수정"

# 새 기능
git tag -a v1.1.0 -m "알림 기능 추가"

# 큰 변경
git tag -a v2.0.0 -m "새로운 UI 및 API 변경"

- GitHub Release 만들기

GitHub에서 Tag를 사용해 Release를 만들 수 있습니다.

방법 1: CLI로 Release 생성

bash
# 1. Tag 생성
git tag -a v1.0.0 -m "Release v1.0.0"

# 2. Tag 푸시
git push origin v1.0.0

# 3. GitHub에서 자동으로 Release 페이지 생성됨
# https://github.com/username/repo/releases/tag/v1.0.0

방법 2: GitHub 웹에서 Release 생성

1. GitHub 저장소 페이지 접속
2. "Releases" 탭 클릭
3. "Create a new release" 버튼 클릭
4. Tag 선택 또는 새로 생성
5. Release title 입력 (예: v1.0.0)
6. Release notes 작성
7. 파일 첨부 (선택 사항)
8. "Publish release" 클릭

Release Notes 작성 예시

markdown
## v1.0.0 - 2024-12-16

### 🎉 새로운 기능
- 사용자 인증 시스템 (로그인/회원가입)
- 프로필 관리 페이지
- 대시보드 구현

### 🐛 버그 수정
- 로그인 세션 만료 이슈 수정
- 모바일 반응형 UI 개선
- 이메일 유효성 검사 버그 수정

### 🔧 개선 사항
- API 응답 속도 30% 향상
- 데이터베이스 쿼리 최적화
- 에러 메시지 개선

### ⚠️ Breaking Changes
- 없음

### 📦 의존성
- React 18.2.0
- Node.js 18.x 이상 필요

### 👥 기여자
- @ryan-sin
- @sarah-kim
- @john-lee

**Full Changelog**: https://github.com/username/repo/compare/v0.9.0...v1.0.0

- 실전 릴리즈 워크플로우

전체 릴리즈 프로세스

bash
# === 1. 개발 완료 확인 ===
# 모든 기능이 develop 브랜치에 병합됨

# === 2. Release 브랜치 생성 ===
git checkout develop
git checkout -b release/v1.0.0

# === 3. 버전 번호 업데이트 ===
# package.json, version.txt 등에서 버전 번호 수정
git add .
git commit -m "chore: bump version to 1.0.0"

# === 4. 최종 테스트 ===
# 테스트 실행, 버그 수정

# === 5. main 브랜치로 병합 ===
git checkout main
git merge --no-ff release/v1.0.0
git push origin main

# === 6. Tag 생성 ===
git tag -a v1.0.0 -m "Release v1.0.0

주요 기능:
- 사용자 인증
- 프로필 관리
- 대시보드

버그 수정:
- 로그인 세션 이슈
- UI 반응형 개선"

# === 7. Tag 푸시 ===
git push origin v1.0.0

# === 8. develop 브랜치에도 병합 ===
git checkout develop
git merge --no-ff release/v1.0.0
git push origin develop

# === 9. Release 브랜치 삭제 ===
git branch -d release/v1.0.0

# === 10. GitHub에서 Release 생성 ===
# GitHub 웹 인터페이스에서 Release Notes 작성

핫픽스 워크플로우

bash
# === 긴급 버그 발견! v1.0.0 → v1.0.1 ===

# 1. main 브랜치의 Tag에서 hotfix 브랜치 생성
git checkout -b hotfix/v1.0.1 v1.0.0

# 2. 버그 수정
# ... 코드 수정 ...
git add .
git commit -m "fix: 로그인 버그 긴급 수정"

# 3. 버전 번호 업데이트
git commit -m "chore: bump version to 1.0.1"

# 4. main에 병합
git checkout main
git merge --no-ff hotfix/v1.0.1
git push origin main

# 5. Tag 생성 및 푸시
git tag -a v1.0.1 -m "핫픽스: 로그인 버그 수정"
git push origin v1.0.1

# 6. develop에도 병합
git checkout develop
git merge --no-ff hotfix/v1.0.1
git push origin develop

# 7. hotfix 브랜치 삭제
git branch -d hotfix/v1.0.1

- Tag 명령어 정리

bash
# === 생성 ===
git tag v1.0.0                           # Lightweight Tag
git tag -a v1.0.0 -m "메시지"             # Annotated Tag (권장)
git tag -a v1.0.0 커밋해시 -m "메시지"     # 특정 커밋에 Tag

# === 확인 ===
git tag                                  # Tag 목록
git tag -l "v1.*"                        # 패턴으로 검색
git tag -n                               # 메시지와 함께 보기
git show v1.0.0                          # Tag 상세 정보
git log --oneline --decorate             # 커밋과 Tag 함께 보기

# === 삭제 ===
git tag -d v1.0.0                        # 로컬 Tag 삭제
git push origin --delete v1.0.0          # 원격 Tag 삭제
git push origin :refs/tags/v1.0.0        # 원격 Tag 삭제 (다른 방법)

# === 푸시 ===
git push origin v1.0.0                   # 특정 Tag 푸시
git push origin --tags                   # 모든 Tag 푸시
git push origin --follow-tags            # Annotated Tag만 푸시

# === 체크아웃 ===
git checkout v1.0.0                      # Tag로 이동 (detached HEAD)
git checkout -b 브랜치명 v1.0.0           # Tag 기반 브랜치 생성

# === 비교 ===
git diff v1.0.0 v2.0.0                   # 두 Tag 비교
git log v1.0.0..v2.0.0                   # Tag 간 커밋 이력

- Tag 사용 팁

1. 항상 Annotated Tag 사용

bash
❌ 나쁜 예:
git tag v1.0.0

✅ 좋은 예:
git tag -a v1.0.0 -m "Release v1.0.0 - 첫 번째 정식 릴리즈"

2. 의미있는 메시지 작성

bash
❌ 나쁜 예:
git tag -a v1.0.0 -m "릴리즈"

✅ 좋은 예:
git tag -a v1.0.0 -m "Release v1.0.0

주요 기능:
- 사용자 인증 시스템
- 프로필 관리
- 대시보드

버그 수정:
- 로그인 세션 만료 이슈
- UI 반응형 개선"

3. Semantic Versioning 준수

bash
# MAJOR: 호환성 없는 변경
v1.0.0 → v2.0.0

# MINOR: 새 기능 추가
v1.0.0 → v1.1.0

# PATCH: 버그 수정
v1.0.0 → v1.0.1

4. Tag 푸시 잊지 않기

bash
# Tag는 자동으로 푸시되지 않음!
git push origin main
git push origin v1.0.0  # Tag도 별도로 푸시

# 또는 한번에
git push origin main --follow-tags

5. 공개된 Tag는 수정하지 않기

bash
# 이미 배포된 Tag는 절대 수정하지 마세요
# 대신 새로운 버전을 만드세요

# ❌ 나쁜 예:
git tag -d v1.0.0
git tag -a v1.0.0 -m "수정..."
git push origin v1.0.0 --force

# ✅ 좋은 예:
git tag -a v1.0.1 -m "수정 사항 포함"
git push origin v1.0.1

6. CHANGELOG 파일 유지

bash
# CHANGELOG.md 파일에 버전별 변경 사항 기록

## [1.0.0] - 2024-12-16
### Added
- 사용자 인증 기능
- 프로필 관리

### Fixed
- 로그인 버그 수정

### Changed
- API 응답 속도 개선

- 자주 하는 실수와 해결법

실수 1: Tag를 푸시하지 않음

문제: bash

git tag -a v1.0.0 -m "릴리즈"
git push origin main
# Tag는 푸시되지 않음!

 

해결: bash

# Tag도 별도로 푸시해야 함
git push origin v1.0.0

# 또는 항상 함께 푸시
git push origin main --follow-tags

실수 2: 잘못된 버전 번호

문제: bash

git tag v1.0.0
# 이미 v1.1.0이 있는데...

 

해결: bash

# 항상 최신 Tag 확인
git tag | sort -V

# 올바른 버전 번호 사용
git tag -a v1.2.0 -m "메시지"

실수 3: Lightweight Tag 사용

문제: bash

git tag v1.0.0  # 정보가 부족함

 

해결: bash

# 삭제 후 Annotated Tag 재생성
git tag -d v1.0.0
git tag -a v1.0.0 -m "상세한 메시지"

실수 4: 공개된 Tag 수정

문제: bash

git tag -d v1.0.0
git tag -a v1.0.0 -m "수정"
git push origin v1.0.0 --force
# 다른 사람들에게 혼란!

 

해결: bash

# 새로운 버전 만들기
git tag -a v1.0.1 -m "수정 사항"
git push origin v1.0.1

실수 5: Tag와 브랜치 이름 중복

문제: bash

git tag v1.0.0
git branch v1.0.0  # 혼란 발생

해결 : bash

# Tag와 브랜치는 다른 이름 사용
git tag v1.0.0
git branch release/v1.0.0  # 명확한 구분

마무리

이번 시간에는 Git Tag를 사용한 버전 관리와 릴리즈에 대해 알아봤습니다. Tag는 소프트웨어의 특정 시점을 표시하는 중요한 기능으로, 릴리즈 관리에 필수적입니다. 항상 Annotated Tag를 사용하고, Semantic Versioning 규칙을 따르며, 의미있는 메시지를 작성하는 습관을 들이시기 바랍니다. Tag는 한번 공개하면 수정하지 않는 것이 원칙입니다.

다음 시간에는 Git Reset vs Revert vs Restore에 대해 알아보겠습니다.