| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 조건문
- SWIFT
- 개발자
- state
- 상속
- javascript
- restful api
- kafka
- java
- Sequelize
- 반복문
- vue
- props
- jpa
- spring boot
- 개발이 취미인 사람
- react
- Producer
- component
- back-end
- Kotlin
- Nest.js
- front-end
- AWS
- file upload
- node.js
- 개발이취미인사람
- swagger
- It
- 코틀린
- Today
- Total
개발이 취미인 사람
[Git] - Git Tag - 버전 관리 및 릴리즈 본문
개요
안녕하세요. 이번 시간에는 Git Tag에 대해 알아보겠습니다. Tag는 특정 커밋에 버전을 표시하는 기능으로, 소프트웨어 릴리즈 관리에 필수적입니다. v1.0.0, v2.1.0과 같은 버전 번호를 Git으로 관리하는 방법을 배워보겠습니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.
- 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
| 이동 | 새 커밋 생성 시 이동 | 고정 (이동 안함) |
| 용도 | 개발 작업 | 버전 표시 |
| 수정 | 자주 수정됨 | 거의 수정 안함 |
| 예시 | main, develop | v1.0.0, v2.0.0 |
- Tag의 종류
Git에는 두 가지 종류의 Tag가 있습니다.

1. Lightweight Tag (가벼운 태그)
단순히 특정 커밋을 가리키는 포인터입니다.
# Lightweight Tag 생성
git tag v1.0.0
# 특정 커밋에 Tag 생성
git tag v1.0.0 a1b2c3d
특징:
- 태그 이름만 저장
- 추가 정보 없음
- 빠르고 간단
- 임시 태그나 개인용으로 사용
2. Annotated Tag (주석 태그) - 권장
태그 작성자, 날짜, 메시지 등의 정보를 포함하는 완전한 객체입니다.
# Annotated Tag 생성
git tag -a v1.0.0 -m "첫 번째 정식 릴리즈"
# 특정 커밋에 Tag 생성
git tag -a v1.0.0 a1b2c3d -m "메시지"
특징:
- 태그 작성자 정보 저장
- 태그 생성 날짜 저장
- 태그 메시지 저장
- GPG 서명 가능
- 공식 릴리즈에 권장
Lightweight vs Annotated 비교
| 생성 | git tag v1.0.0 | git tag -a v1.0.0 -m "메시지" |
| 정보 | 커밋만 가리킴 | 작성자, 날짜, 메시지 포함 |
| 사용 | 임시 태그 | 공식 릴리즈 |
| 권장도 | 낮음 | 높음 (권장) |
💡 권장: 공식 릴리즈는 항상 Annotated Tag를 사용하세요!
- Tag 생성하기
현재 커밋에 Tag 생성
# Annotated Tag 생성 (권장)
git tag -a v1.0.0 -m "첫 번째 정식 릴리즈"
# Lightweight Tag 생성
git tag v1.0.0
# 긴 메시지로 Tag 생성 (에디터 열림)
git tag -a v1.0.0
# 에디터에서 메시지 작성 후 저장
과거 커밋에 Tag 생성
# 커밋 히스토리 확인
git log --oneline
# 출력
a1b2c3d feat: 사용자 인증 기능 추가
b2c3d4e fix: 로그인 버그 수정
c3d4e5f init: 프로젝트 초기 설정
# 특정 커밋에 Tag 생성
git tag -a v1.0.0 a1b2c3d -m "사용자 인증 기능 릴리즈"
실전 예시
# === 시나리오: 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 목록 보기
# 모든 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 정보 상세 보기
# 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가 가리키는 커밋 확인
# 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 삭제
# 로컬 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 삭제
# 원격 저장소의 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는 한번 만들면 수정할 수 없습니다. 삭제 후 다시 만들어야 합니다.
# 잘못된 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 푸시
# 특정 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 푸시
# 모든 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만 푸시
# Annotated Tag만 푸시 (Lightweight 제외)
git push origin --follow-tags
실전 워크플로우
# === 릴리즈 배포 과정 ===
# 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로 이동 (읽기 전용)
# Tag로 체크아웃
git checkout v1.0.0
# 경고 메시지
Note: checking out 'v1.0.0'.
You are in 'detached HEAD' state...
# 이 상태에서는 읽기만 가능
# 커밋은 가능하지만 저장되지 않음
Tag 기반으로 브랜치 생성
# 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의 코드 확인
# 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 |
버전 번호 예시
# 첫 번째 개발 버전
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 버전
# 알파 버전 (내부 테스트)
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
실전 버전 관리 예시
# 프로젝트 시작
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 생성
# 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 작성 예시
## 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
- 실전 릴리즈 워크플로우


전체 릴리즈 프로세스
# === 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 작성
핫픽스 워크플로우
# === 긴급 버그 발견! 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 명령어 정리
# === 생성 ===
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 사용
❌ 나쁜 예:
git tag v1.0.0
✅ 좋은 예:
git tag -a v1.0.0 -m "Release v1.0.0 - 첫 번째 정식 릴리즈"
2. 의미있는 메시지 작성
❌ 나쁜 예:
git tag -a v1.0.0 -m "릴리즈"
✅ 좋은 예:
git tag -a v1.0.0 -m "Release v1.0.0
주요 기능:
- 사용자 인증 시스템
- 프로필 관리
- 대시보드
버그 수정:
- 로그인 세션 만료 이슈
- UI 반응형 개선"
3. Semantic Versioning 준수
# MAJOR: 호환성 없는 변경
v1.0.0 → v2.0.0
# MINOR: 새 기능 추가
v1.0.0 → v1.1.0
# PATCH: 버그 수정
v1.0.0 → v1.0.1
4. Tag 푸시 잊지 않기
# Tag는 자동으로 푸시되지 않음!
git push origin main
git push origin v1.0.0 # Tag도 별도로 푸시
# 또는 한번에
git push origin main --follow-tags
5. 공개된 Tag는 수정하지 않기
# 이미 배포된 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 파일 유지
# 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에 대해 알아보겠습니다.
'컴퓨터공학 > Git' 카테고리의 다른 글
| [Git] - Git Stash - 임시 저장 활용법 (0) | 2025.12.26 |
|---|---|
| [Git] - Pull Request(PR) / Merge Request(MR) 작성법 (0) | 2025.12.25 |
| [Git] - Clone vs Fork 차이점 (0) | 2025.12.24 |
| [Git] - push, pull, fetch 명령어 이해 (0) | 2025.12.23 |
| [Git] - 충돌(Conflict) 해결 방법 (0) | 2025.12.22 |