Git 브랜치 전략 완벽 비교: Git Flow vs GitHub Flow vs Trunk-Based
·7분 읽기
팀으로 개발하다 보면 반드시 마주치는 문제가 있습니다. "이 기능은 어느 브랜치에서 작업해야 하지? 핫픽스는 어떻게 배포하지?" 브랜치 전략은 이런 혼란을 없애고 팀이 일관된 방식으로 코드를 관리하게 해줍니다.
Git Flow#
Vincent Driessen이 2010년에 제안한 전략으로, 가장 널리 알려진 브랜치 전략입니다.
브랜치 구조#
main ──●──────────────────────●── (배포 버전)
│ │
develop ──●──●──●──●──●──●──●──●── (개발 통합)
│ │
feature/login ─────●──●──●──┘
│
feature/signup ──────────●──●──●──┘
| 브랜치 | 역할 | 생명주기 |
|---|---|---|
main | 프로덕션 배포 버전 | 영구 |
develop | 개발 통합 브랜치 | 영구 |
feature/* | 기능 개발 | 임시 (merge 후 삭제) |
release/* | 배포 준비 | 임시 |
hotfix/* | 긴급 버그 수정 | 임시 |
워크플로우#
# 1. feature 브랜치 생성
git checkout develop
git checkout -b feature/user-login
# 2. 개발 및 커밋
git add .
git commit -m "feat: 로그인 기능 구현"
# 3. develop에 merge
git checkout develop
git merge feature/user-login
git branch -d feature/user-login
# 4. release 브랜치로 배포 준비
git checkout -b release/1.0.0
# 버그 수정, 버전 업데이트...
# 5. main과 develop에 merge
git checkout main
git merge release/1.0.0
git tag -a v1.0.0 -m "Version 1.0.0"
git checkout develop
git merge release/1.0.0
언제 쓸까?#
- 정기적인 버전 릴리즈가 있는 프로젝트 (앱 스토어, 패키지 라이브러리)
- QA 단계가 길고 복잡한 경우
- 여러 버전을 동시에 지원해야 하는 경우
GitHub Flow#
GitHub이 사용하는 단순한 전략입니다. 브랜치는 main과 feature 두 종류뿐입니다.
워크플로우#
# 1. main에서 브랜치 생성
git checkout main
git checkout -b feature/add-search
# 2. 개발 및 커밋
git commit -m "feat: 검색 기능 추가"
# 3. Pull Request 생성 → 코드 리뷰 → main에 merge
# 4. 즉시 배포 (main == 프로덕션)
핵심 원칙#
main브랜치는 항상 배포 가능한 상태- 모든 변경은 PR을 통해 리뷰
- merge되면 즉시 배포
언제 쓸까?#
- 지속적 배포(CD)를 실천하는 팀
- 소규모 팀, 스타트업
- 웹 서비스처럼 항상 최신 버전 하나만 운영하는 경우
Trunk-Based Development#
main(trunk) 하나에 모든 개발자가 자주 커밋하는 방식입니다.
# 단명 브랜치 (1-2일 이내 merge)
git checkout -b feature/fix-button
git commit -m "fix: 버튼 스타일 수정"
git push
# PR → 즉시 merge
# 또는 직접 main에 push (소규모 팀)
git commit -m "chore: 패키지 업데이트"
git push origin main
Feature Flag와 함께 사용#
완성되지 않은 기능은 Feature Flag로 숨깁니다.
if (featureFlags.isEnabled('new-dashboard')) {
return <NewDashboard />
}
return <OldDashboard />
언제 쓸까?#
- CI/CD가 잘 갖춰진 팀
- 테스트 커버리지가 높은 경우
- 대규모 팀에서 merge 충돌을 줄이고 싶을 때
전략 비교#
| 기준 | Git Flow | GitHub Flow | Trunk-Based |
|---|---|---|---|
| 복잡도 | 높음 | 낮음 | 중간 |
| 배포 빈도 | 낮음 (주기적) | 높음 (수시) | 매우 높음 |
| 팀 규모 | 중대형 | 소중형 | 모든 규모 |
| 릴리즈 관리 | 명확 | 단순 | Feature Flag 필요 |
| 핫픽스 처리 | 체계적 | 빠름 | 즉각적 |
| 학습 곡선 | 높음 | 낮음 | 낮음 |
커밋 메시지 컨벤션#
어떤 전략을 쓰든 커밋 메시지 규칙을 통일하면 히스토리 관리가 쉬워집니다.
# Conventional Commits 형식
feat: 새로운 기능 추가
fix: 버그 수정
docs: 문서 수정
style: 코드 포맷팅
refactor: 리팩토링
test: 테스트 추가/수정
chore: 빌드 설정, 패키지 업데이트
# 예시
feat: 소셜 로그인 (Google OAuth) 구현
fix: 모바일에서 드롭다운 메뉴 닫히지 않는 문제 수정
docs: API 인증 방법 README에 추가
추천 선택 기준#
- 스타트업 / 소규모 팀: GitHub Flow — 단순하고 빠릅니다
- 앱/패키지 버전 관리 필요: Git Flow — 릴리즈 관리가 체계적입니다
- 대규모 팀, CI/CD 성숙: Trunk-Based — merge 충돌 최소화, 빠른 통합
어떤 전략이든 팀 전체가 합의하고 일관되게 따르는 것이 가장 중요합니다. 전략 자체보다 팀의 규율이 더 큰 영향을 미칩니다.
관련 포스트
개발#성능 최적화#Web Vitals#Next.js#프론트엔드
웹 성능 최적화 실전 가이드: Core Web Vitals와 최적화 기법
LCP, FID, CLS 등 Core Web Vitals의 의미와 실제 프론트엔드 성능을 개선하는 실전 기법을 정리했습니다.
·9분 읽기
개발#Docker#DevOps#컨테이너#인프라
Docker 입문 가이드: 개발자가 꼭 알아야 할 컨테이너 기초
Docker가 왜 필요한지부터 이미지, 컨테이너, Docker Compose까지 개발자 관점에서 실용적으로 정리했습니다.
·8분 읽기
개발#API#REST#GraphQL#백엔드
REST API vs GraphQL: 실무에서 뭘 선택해야 할까?
REST와 GraphQL의 핵심 차이를 이해하고, 프로젝트 상황에 따른 올바른 선택 기준을 정리했습니다.
·8분 읽기