je개발 회고

[ Git ] 회사에 맞는 브랜치 전략

Je-chan 2025. 12. 22. 17:11

Git 브랜치 전략 가이드

팀 프로젝트에서 Git을 효율적으로 운용하기 위한 브랜치 전략을 정리합니다. maindevelop을 중심으로 feature, release, hotfix 브랜치를 운용하는 방식입니다.

💡 참고

설명의 편의를 위해 도표나 설명에는 feature 키워드를 사용합니다. 실제 개발 시에는 120-feat-login, 121-refactor-auth와 같은 형태의 브랜치명을 활용합니다.

브랜치 흐름도

전체적인 브랜치 흐름은 다음과 같습니다. 각 브랜치가 어떻게 분기되고 병합되는지 시각적으로 확인할 수 있습니다.

Git 브랜치 흐름

main
 
 
 
v1.0.0
 
v1.0.1
release
 
 
 
 
 
develop
 
 
 
 
 
 
feature/a
 
 
feature/b
 
 
 
hotfix
 

브랜치 관계 요약

일반 개발

feature/*
↓ merge
develop

릴리즈

develop
↓ branch
release/*
↓ merge
main

긴급 수정

main
↓ branch
hotfix/*
↓ merge
main

브랜치 설명

브랜치 설명 배포 환경 merge 대상
main Production 배포용. 언제나 안정적이고 배포 가능한 상태를 유지합니다. 운영 서버 release/*, hotfix/*에서 병합
develop 코드 통합용. 다음 릴리즈를 위한 베이스캠프 역할을 합니다. - feature/*에서 병합
release/* QA 브랜치. 배포 전 QA를 진행합니다. 개발 서버 main, develop으로 병합
feature/* 일반적인 개발 브랜치입니다. - develop으로 병합
hotfix/* Production 긴급 버그 수정용입니다. - main으로 병합

브랜치 보호 규칙

브랜치 보호 규칙
main PR 필수 (Direct Push 금지)
release, develop CI 테스트 통과 필수

🏷️ 브랜치 명명 규칙

타입 구조 예시
기능 <이슈번호>-feat-<이슈요약> 302-feat-login
릴리즈 release/v<Major>.<Minor>.<Patch> release/v1.0.0, release/v2.1.3
핫픽스 hotfix/<버전 또는 이슈> hotfix/v1.0.1, hotfix/security-patch

⚠️ 중요

release 브랜치는 반드시 release/v<Major>.<Minor>.<Patch> 형식이어야 합니다. CI에서 브랜치 이름의 버전 형식과 기존 태그 대비 버전 유효성을 자동 검증합니다.


🔄 작업 워크플로우

1. 기능 개발 (Feature)

Feature 워크플로우

1
develop 브랜치 체크아웃
git checkout developgit pull origin develop
2
feature 브랜치 생성
git checkout -b feature/my-feature
3
작업 수행 및 커밋
코드 작성 후 커밋을 진행합니다.
4
원격 저장소 푸시
git push origin feature/my-feature
5
PR 생성 및 리뷰
feature → develop 방향으로 PR을 생성하고 리뷰 후 Squash Merge를 진행합니다.
# 1. develop 최신화 및 feature 브랜치 생성
git checkout develop
git pull origin develop
git checkout -b feature/my-feature

# 2. 작업 수행 및 커밋
git add .
git commit -m "feat: 사용자 로그인 로직 추가"

# 3. 원격 저장소 푸시 및 PR 생성
git push origin feature/my-feature
# → GitHub/GitLab에서 develop 브랜치로 Pull Request 생성

2. 릴리즈 (Release)

Release 워크플로우

1
release 브랜치 생성
develop에서 git checkout -b release/v1.0.0
2
개발 서버 배포 및 QA
release 브랜치를 개발 서버에 배포하고 QA를 진행합니다.
3
버그 수정 (필요시)
QA 중 발견된 버그는 release 브랜치에서 직접 수정합니다.
4
main으로 PR 생성 및 병합
리뷰 완료 후 main 브랜치에 병합합니다.
5
CI 자동화
버전 범핑과 태그 생성이 자동으로 수행됩니다.
6
develop에 변경사항 반영
release 브랜치의 변경사항을 develop에도 반영합니다.
# 1. release 브랜치 생성 (반드시 v0.0.0 형식 준수)
git checkout develop
git pull origin develop
git checkout -b release/v1.0.0

# 2. release 브랜치 푸시 (개발 서버에 배포됨)
git push origin release/v1.0.0

# 3. QA 진행 - 버그 발견 시 해당 브랜치에서 수정
git commit -m "fix: QA에서 발견된 버그 수정"
git push origin release/v1.0.0

# 4. QA 완료 후 main으로 PR 생성 및 병합
# → GitHub/GitLab에서 main으로 PR 생성 → 리뷰 → Merge

# 5. develop에 변경사항 반영
git checkout develop
git merge release/v1.0.0
git push origin develop

📌 참고

release 브랜치가 main에 병합되면 CI가 자동으로 버전 범핑과 태그 생성 그리고 패키지 배포를 수행합니다.

3. 핫픽스 (Hotfix)

Hotfix 워크플로우

1
main 기반 hotfix 브랜치 생성
git checkout -b hotfix/v1.0.1
2
긴급 수정 및 커밋
버그를 수정하고 커밋합니다.
3
main 병합 및 태그
main에 병합하고 태그를 생성합니다.
4
release 및 develop 반영
hotfix 내용을 release와 develop에도 반영합니다.
# 1. main 기반 hotfix 브랜치 생성
git checkout main
git pull origin main
git checkout -b hotfix/v1.0.1

# 2. 긴급 수정
git commit -m "fix: 심각한 보안 이슈 수정"

# 3. main 병합 및 태그
git checkout main
git merge hotfix/v1.0.1
git tag v1.0.1
git push origin main --tags

# 4. release에도 반영
git checkout release/v1.0.1
git merge main
git push origin release/v1.0.1

# 5. develop에도 반영
git checkout develop
git merge release/v1.0.1
git push origin develop

커밋 메시지 컨벤션

형식

<type>(<scope>): <subject>

<body>

Type 종류

Type 설명 버전 영향
feat 새로운 기능 추가 Minor
improve 기존 기능 개선/수정 (동작 변경 포함) Minor
fix 버그 수정 Patch
docs 문서 수정 -
style 코드 포맷팅 (로직 변경 없음) -
refactor 코드 리팩토링 (기능 변경 없음) Patch
perf 성능 개선 Patch
test 테스트 코드 추가/수정 -
chore 빌드 업무 및 패키지 매니저 설정 등 -

feat vs improve vs refactor

세 가지 타입이 헷갈릴 수 있어 정리합니다.

Type 사용 시점 예시
feat 없던 기능을 새로 만들 때 다크모드 기능 추가
improve 있던 기능을 개선/변경할 때 버튼 클릭 피드백 개선
refactor 동작은 그대로이고 코드만 정리할 때 함수 분리 및 변수명 변경

예시

feat(auth): 구글 소셜 로그인 추가
improve(button): 버튼 클릭 시 ripple 효과 개선
fix(modal): 모달 닫기 버튼 정렬 수정
refactor(utils): 날짜 포맷 함수 분리
chore(deps): 패키지 의존성 업데이트

Breaking Change

호환성이 깨지는 변경은 커밋 타입 뒤에 !를 붙이거나 footer에 BREAKING CHANGE:를 명시합니다.

feat!: API 응답 형식 변경

BREAKING CHANGE: 기존 { data: [] } 형식에서 { items: [], total: number } 형식으로 변경