Git 브랜치 전략: Git Flow부터 Trunk-Based까지
Git Flow, GitHub Flow, Trunk-Based Development 등 브랜치 전략 비교와 선택 기준
개요
브랜치 전략(Branching Strategy)은 팀이 코드를 어떻게 분리하고, 통합하며, 릴리스할 것인가를 정의하는 규약이다. 팀 규모, 릴리스 주기, 제품 특성에 따라 적합한 전략이 다르며, 2026년 현재 Trunk-Based Development가 DevOps/CI-CD 중심 조직의 주류로 자리잡고 있다.
Git Flow
개요
Vincent Driessen이 2010년에 제안한 전통적 브랜치 모델이다. 주기적 릴리스가 있는 프로젝트에 적합하다.
브랜치 구조
master (production)
│
├── hotfix/payment-bug ────→ master + develop에 머지
│
├── release/1.2.0 ─────────→ master + develop에 머지
│
develop (통합 브랜치)
│
├── feature/user-auth ──→ develop에 머지
├── feature/payment ────→ develop에 머지
└── feature/notification → develop에 머지브랜치 역할
| 브랜치 | 수명 | 용도 | 머지 대상 |
|---|---|---|---|
master (main) | 영구 | 프로덕션 배포 코드 | - |
develop | 영구 | 다음 릴리스 통합 | - |
feature/* | 임시 | 신규 기능 개발 | develop |
release/* | 임시 | 릴리스 준비 (QA, 버그 수정) | master + develop |
hotfix/* | 임시 | 프로덕션 긴급 수정 | master + develop |
Git Flow 워크플로우
# 1. 기능 개발 시작
git checkout develop
git checkout -b feature/user-auth
# 2. 기능 개발 완료 → develop에 머지
git checkout develop
git merge --no-ff feature/user-auth
git branch -d feature/user-auth
# 3. 릴리스 준비
git checkout develop
git checkout -b release/1.2.0
# 4. 릴리스 완료 → master와 develop에 머지
git checkout master
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release 1.2.0"
git checkout develop
git merge --no-ff release/1.2.0
git branch -d release/1.2.0
# 5. 핫픽스
git checkout master
git checkout -b hotfix/payment-bug
# 수정 후
git checkout master
git merge --no-ff hotfix/payment-bug
git tag -a v1.2.1 -m "Hotfix: payment bug"
git checkout develop
git merge --no-ff hotfix/payment-bug장단점
| 장점 | 단점 |
|---|---|
| 릴리스 관리가 체계적 | 브랜치가 많아 복잡도 높음 |
| 버전 관리가 명확 | 머지 충돌이 빈번 |
| 안정적인 프로덕션 유지 | CI/CD와 잘 맞지 않음 |
| 대규모 팀에 적합 | 배포 주기가 길어질 수 있음 |
적합한 상황
- 모바일 앱 (앱스토어 심사 주기)
- 온프레미스(On-Premise) 소프트웨어
- 주기적 릴리스 (2주, 4주 단위)
- 여러 버전을 동시에 유지보수하는 제품
Trunk-Based Development (TBD)
개요
**단일 메인 브랜치(trunk/main)**를 중심으로, 짧은 수명의 브랜치를 빈번하게 머지하는 전략이다. Google, Facebook, Netflix 등 대형 테크 기업이 채택하고 있으며, 2026년 현재 CI/CD 중심 조직의 표준 전략이다.
핵심 원칙
main (trunk)
│
├── short-lived branch (수 시간~2일)
│ └──→ 빈번한 머지 (하루에 여러 번)
│
├── short-lived branch
│ └──→ 빈번한 머지
│
└── 항상 배포 가능한 상태 유지- 짧은 수명 브랜치: 최대 2일, 이상적으로는 수 시간
- 빈번한 통합: 하루에 여러 번 main에 머지
- 항상 배포 가능: main은 언제든 프로덕션에 배포할 수 있는 상태
- Feature Flag: 미완성 기능은 코드에 존재하되 비활성화 상태로 유지
Feature Flag (기능 플래그)
// Feature Flag로 미완성 기능 제어
if (featureFlags.isEnabled("new-checkout-flow")) {
return newCheckoutService.process(order);
} else {
return legacyCheckoutService.process(order);
}| Feature Flag 도구 | 특징 |
|---|---|
| LaunchDarkly | SaaS, 실시간 토글, A/B 테스트 |
| Unleash | 오픈소스, 셀프 호스팅 |
| Flagsmith | 오픈소스, SaaS 모두 제공 |
| AWS AppConfig | AWS 네이티브 통합 |
| OpenFeature | 벤더 중립 표준 (CNCF, 2026 부상) |
TBD와 CI/CD
개발자 커밋 → main 머지 → CI 파이프라인
│
┌─────┼─────┐
│ │ │
빌드 테스트 보안검사
│ │ │
└─────┼─────┘
│
자동 배포 (CD)
│
┌───────┼───────┐
│ │ │
Staging Canary Production장단점
| 장점 | 단점 |
|---|---|
| 머지 충돌 최소화 | Feature Flag 관리 복잡 |
| 빠른 피드백 루프 | 강력한 CI/CD 필수 |
| 배포 빈도 극대화 | 테스트 자동화 필수 |
| 코드 리뷰 부담 감소 (작은 PR) | 미숙한 팀에서는 main 불안정 |
GitHub Flow
개요
GitHub이 제안한 간소화된 브랜치 모델이다. main 브랜치와 feature 브랜치만 사용한다.
워크플로우
main ─── A ─── B ─── C ─── D ─── E ─── F
\ /
└── feat ──┘
(PR + Review)- main에서 브랜치 생성
- 커밋 추가
- Pull Request 생성
- 코드 리뷰
- main에 머지
- 즉시 배포
Git Flow와의 비교
| 비교 | Git Flow | GitHub Flow |
|---|---|---|
| 브랜치 수 | 5종류 | 2종류 (main + feature) |
| 복잡도 | 높음 | 낮음 |
| 배포 빈도 | 주기적 | 머지 시 즉시 |
| 적합 규모 | 대규모 팀 | 소-중규모 팀 |
GitLab Flow
개요
GitHub Flow에 **환경 브랜치(Environment Branch)**를 추가한 모델이다.
main ──→ staging ──→ production환경 브랜치
feature → main (개발)
│
▼
staging (테스트/QA)
│
▼
production (프로덕션)- 환경별 배포 게이트 제공
- Cherry-pick으로 핫픽스를 production에 직접 적용 가능
- 릴리스 브랜치 대신 환경 브랜치 사용
Release Flow (Microsoft)
개요
Microsoft가 대규모 팀(Azure DevOps 등)에서 사용하는 전략이다.
핵심 구조
main (항상 배포 가능)
│
├── feature/xxx ──→ main에 머지
│
├── release/2026.02 (릴리스 시점에 분기)
│ └── cherry-pick (핫픽스만)
│
└── release/2026.03- main: Trunk-Based와 유사, 항상 배포 가능
- release 브랜치: 릴리스 시점에 main에서 분기, 핫픽스만 cherry-pick
- 여러 릴리스를 동시에 지원해야 하는 제품에 적합
모노레포 전략
모노레포란?
하나의 Git 리포지토리에 여러 프로젝트/서비스를 관리하는 전략이다. Google, Meta, Microsoft 등이 채택하고 있다.
모노레포 도구 생태계
| 도구 | 특징 | 사용 기업 |
|---|---|---|
| Nx | 스마트 빌드 캐시, 의존성 그래프 분석 | Nrwl, 다양한 기업 |
| Turborepo | 원격 캐싱, 파이프라인 기반 태스크 실행 | Vercel |
| Bazel | 다언어 지원, 허메틱 빌드, 원격 실행 | Google, Uber, Airbnb |
| Lerna | npm 패키지 관리, 버저닝 | 오픈소스 커뮤니티 |
| Rush | Microsoft 대규모 모노레포 관리 | Microsoft |
| Moon | Rust 기반, 빠른 태스크 실행 (2026 신생) | 커뮤니티 |
모노레포 + Trunk-Based Development
monorepo/
├── services/
│ ├── auth-service/ ← 팀 A
│ ├── payment-service/ ← 팀 B
│ └── notification/ ← 팀 C
├── packages/
│ ├── shared-utils/ ← 공유 유틸리티
│ └── ui-components/ ← 공유 UI
└── tools/
└── ci-scripts/ ← CI 도구핵심 도전과제:
- 영향 범위 분석 (Affected Analysis): 변경된 코드가 어떤 서비스에 영향을 미치는지 자동 판별
- 선택적 빌드/테스트: 변경된 서비스만 빌드하고 테스트
- CODEOWNERS: 디렉토리별 코드 소유자 지정으로 자동 리뷰어 할당
# Nx: 영향 받는 프로젝트만 테스트
npx nx affected --target=test
# Turborepo: 캐시된 결과 활용
turbo run build --filter=auth-service...머지 큐 (Merge Queue)
문제: Rebase Race
여러 PR이 동시에 승인되면 다음과 같은 문제가 발생한다:
PR #1: 승인 → 머지 시도 → 성공
PR #2: 승인 → main이 변경됨 → 리베이스 필요 → 재테스트 → 머지 시도
PR #3: 승인 → 또 main이 변경됨 → 리베이스 필요 → 재테스트...머지 큐의 해결
PR #1 ─┐
PR #2 ─┤──→ [Merge Queue] ──→ 자동 리베이스 → 테스트 → 머지
PR #3 ─┘ │
main은 항상 green 상태 유지- PR이 승인되면 머지 큐에 추가
- 큐에서 자동으로 리베이스
- 임시 머지 브랜치에서 테스트 실행
- 통과하면 자동 머지, 실패하면 큐에서 제거
주요 구현체
| 도구 | 특징 |
|---|---|
| GitHub Merge Queue (네이티브) | GitHub Actions와 통합 |
| Mergify | SaaS, 고급 규칙 엔진 |
| Trunk Merge | trunk.io 생태계 통합 |
| Aviator MergeQueue | 모노레포 최적화 |
| Bors | 오픈소스, Rust 커뮤니티에서 시작 |
스택드 PR (Stacked PRs)
개요
대규모 기능을 **작은 PR의 체인(Chain)**으로 분할하여 리뷰와 머지를 병렬화하는 워크플로우이다. Meta 내부 도구에서 시작되어 Graphite가 외부에 보급하였다.
기존 방식 vs 스택드 PR
[기존: 하나의 큰 PR]
feature/big-change ──────────────────────→ main
(1000줄, 리뷰 어려움, 오래 걸림)
[스택드 PR: 여러 작은 PR 체인]
stack/part-1 (DB 스키마) ──→ main
└── stack/part-2 (API) ──→ stack/part-1 위에 쌓임
└── stack/part-3 (UI) ──→ stack/part-2 위에 쌓임장점
- 리뷰 효율: 작은 PR은 집중적이고 빠른 리뷰 가능
- 병렬 개발: part-1 리뷰 중에 part-2, part-3 개발 가능
- 머지 충돌 감소: 작은 변경이 빈번하게 통합
- 롤백 용이: 문제 발생 시 특정 단계만 되돌리기
주요 도구
| 도구 | 특징 |
|---|---|
| Graphite | 스택드 PR 전문, CLI + 웹 대시보드 |
| ghstack (Meta) | GitHub 기반 스택드 PR |
| git-branchless | Hg-like UX, 스택 관리 |
| Aviator | 스택드 PR + 머지 큐 통합 |
# Graphite 사용 예시
gt branch create part-1
# 변경 후
gt commit create -m "feat: add db schema"
gt branch create part-2 # part-1 위에 자동 스택
# 변경 후
gt commit create -m "feat: add API endpoints"
gt stack submit # 전체 스택을 PR로 제출브랜치 보호 규칙 (Branch Protection Rules)
GitHub 브랜치 보호 설정
| 규칙 | 설명 |
|---|---|
| Require pull request reviews | PR 리뷰 필수 (최소 N명) |
| Require status checks to pass | CI 체크 통과 필수 |
| Require branches to be up to date | 머지 전 최신 상태 필수 |
| Require signed commits | GPG/SSH 서명 필수 |
| Require linear history | 머지 커밋 금지 (rebase/squash only) |
| Include administrators | 관리자에게도 규칙 적용 |
| Restrict pushes | 직접 push 제한 |
| Allow auto-merge | 조건 충족 시 자동 머지 |
# GitHub Actions에서 상태 검사 예시
name: CI
on:
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
- run: npm run lint브랜치 전략 선택 가이드
| 기준 | Git Flow | Trunk-Based | GitHub Flow | Release Flow |
|---|---|---|---|---|
| 팀 규모 | 대규모 | 모든 규모 | 소-중규모 | 대규모 |
| 릴리스 주기 | 주기적 (2-4주) | 지속적 | 지속적 | 주기적 |
| 배포 자동화 | 선택적 | 필수 | 권장 | 권장 |
| 동시 버전 유지 | 가능 | 어려움 | 어려움 | 가능 |
| 복잡도 | 높음 | 낮음 | 매우 낮음 | 중간 |
| CI/CD 의존도 | 낮음 | 높음 | 중간 | 중간 |
| Feature Flag | 선택적 | 필수 | 선택적 | 선택적 |
| 모노레포 적합도 | 낮음 | 높음 | 중간 | 높음 |
결정 플로차트
배포 빈도가 높은가? (하루 여러 번)
├── 예 → CI/CD 파이프라인이 견고한가?
│ ├── 예 → Trunk-Based Development
│ └── 아니오 → GitHub Flow
└── 아니오 → 여러 버전을 동시에 유지해야 하는가?
├── 예 → Git Flow 또는 Release Flow
└── 아니오 → GitHub Flow