Git Flow, GitHub Flow, GitLab Flow 비교
한눈에 보기
릴리스 중심의 Git Flow, 지속 배포를 위한 GitHub Flow, 환경 브랜치로 배포 단계를 표현하는 GitLab Flow를 비교하고 배포 주기와 제품 형태에 따른 선택 기준을 정리한다.
최종 업데이트 2026.09.17
깃 플로(Git Flow), 깃허브 플로(GitHub Flow), 깃랩 플로(GitLab Flow)는 팀이 브랜치를 만들고 병합하고 배포하는 방식을 정의한 대표적인 브랜치 전략이다. Git Flow는 버전 릴리스를 전제로 여러 종류의 브랜치를 엄격하게 나누는 전략이고, GitHub Flow는 메인 브랜치 하나와 짧은 기능 브랜치만으로 지속 배포를 지향하는 단순한 전략이며, GitLab Flow는 그 중간에서 환경 브랜치나 릴리스 브랜치로 배포 단계를 표현하는 절충안이다. 어떤 전략이 맞는지는 배포 주기와 제품 형태에 따라 달라진다.
Git Flow: 릴리스 중심의 엄격한 전략
Git Flow는 2010년 빈센트 드리센(Vincent Driessen)이 제안한 모델로, 다섯 종류의 브랜치를 역할별로 나눈다. 영구 브랜치로 main과 develop을 두고, 보조 브랜치로 feature, release, hotfix를 필요할 때 만들었다가 병합 후 삭제한다.
- main: 배포된 버전만 존재하며 커밋마다 버전 태그를 붙인다.
- develop: 다음 릴리스를 준비하는 통합 브랜치다.
- feature: develop에서 분기해서 기능을 개발하고 develop으로 돌아간다.
- release: 릴리스 직전 안정화 작업을 하며, 완료되면 main과 develop 양쪽에 병합한다.
- hotfix: 배포된 버전의 긴급 버그를 main에서 직접 분기해 고치고 양쪽에 병합한다.
# 기능 개발
git checkout -b feature/<기능명> develop
git checkout develop
git merge --no-ff feature/<기능명>
# 릴리스 준비와 배포
git checkout -b release/1.2.0 develop
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0
버전을 명시적으로 관리해야 하는 설치형 소프트웨어, 모바일 앱, 여러 버전을 동시에 지원해야 하는 제품에 잘 맞는다. 반면 브랜치 구조가 복잡하고 병합 지점이 많아, 하루에도 여러 번 배포하는 웹 서비스에는 과한 전략이라는 비판을 받는다. 제안자 본인도 지속 배포 환경이라면 더 단순한 전략을 쓰라고 후기를 남겼다.
GitHub Flow: 지속 배포를 위한 최소 전략
GitHub Flow는 규칙이 단 하나의 원칙으로 요약된다. main 브랜치는 언제나 배포 가능해야 한다는 것이다. 모든 작업은 main에서 분기한 기능 브랜치에서 진행하고, 풀 리퀘스트(Pull Request)를 열어 리뷰와 자동 테스트를 통과하면 main에 병합한다. 병합된 main은 곧바로, 혹은 매우 짧은 주기로 배포된다.
git switch main
git pull origin main
git switch -c feature/<기능명>
# 작업 후
git push -u origin feature/<기능명>
# PR 생성, 리뷰와 CI 통과 후 main에 병합, 즉시 배포
develop도 release도 없기 때문에 배우기 쉽고 병합 충돌이 줄어든다. 다만 릴리스 버전 개념이 없어서 여러 버전을 병행 지원하거나 배포 시점을 통제해야 하는 환경에는 맞지 않고, 배포 파이프라인과 테스트 자동화가 충분히 갖춰져 있어야 안전하게 굴러간다. 아직 공개하면 안 되는 기능은 기능 플래그(feature flag)로 숨기는 기법을 함께 쓴다.
GitLab Flow: 배포 단계를 브랜치로 표현하는 절충안
GitLab Flow는 GitHub Flow의 단순함을 유지하면서, 코드가 여러 환경을 거쳐 배포되는 현실을 브랜치로 표현한다. 두 가지 변형이 있다.
첫째는 환경 브랜치(environment branch) 방식이다. main 외에 staging, production 같은 브랜치를 두고, 코드는 항상 상류에서 하류로만 흐른다. main에 병합된 변경이 검증을 거쳐 staging으로, 다시 production으로 병합되며, 각 브랜치로의 병합이 곧 해당 환경으로의 배포를 의미한다. 어떤 코드가 어느 환경에 있는지 브랜치만 봐도 알 수 있다.
둘째는 릴리스 브랜치(release branch) 방식이다. 버전을 유지 보수해야 하는 제품이라면 main에서 2-3-stable 같은 릴리스 브랜치를 만들고, 버그 수정은 반드시 main에 먼저 적용한 뒤 해당 릴리스 브랜치로 체리픽(cherry-pick)한다. 수정이 main에서 누락되는 사고를 막기 위한 규칙이다.
# main에 먼저 수정 후 릴리스 브랜치로 가져오기
git checkout 2-3-stable
git cherry-pick <수정-커밋-해시>
세 전략 비교와 선택 기준
| 항목 | Git Flow | GitHub Flow | GitLab Flow |
|---|---|---|---|
| 영구 브랜치 | main, develop | main | main과 환경 또는 릴리스 브랜치 |
| 복잡도 | 높음 | 낮음 | 중간 |
| 배포 주기 | 주기적 릴리스 | 지속 배포 | 단계적 배포나 주기적 릴리스 |
| 버전 병행 지원 | hotfix와 태그로 지원 | 어려움 | 릴리스 브랜치로 지원 |
| 잘 맞는 제품 | 설치형 소프트웨어, 앱 | 웹 서비스, SaaS | 환경이 나뉜 서비스, 버전 유지 제품 |
선택 기준은 결국 배포 방식이다. 하루에도 여러 번 배포하는 웹 서비스라면 GitHub Flow, 검증 환경을 거쳐 순차 배포해야 하거나 버전을 유지 보수해야 한다면 GitLab Flow, 명확한 버전 릴리스 주기를 가진 제품이라면 Git Flow가 출발점이 된다. 실제 팀들은 전략을 교과서 그대로 쓰기보다 자기 배포 파이프라인에 맞게 변형해서 쓴다.
면접에서 이렇게 물어본다
- Git Flow의 다섯 가지 브랜치 종류와 각 브랜치의 수명 주기를 설명해 보라.
- GitHub Flow가 성립하려면 어떤 전제 조건(테스트 자동화, 배포 파이프라인 등)이 필요한가.
- hotfix 브랜치를 main과 develop 양쪽에 병합해야 하는 이유는 무엇인가.
- GitLab Flow에서 버그 수정을 main에 먼저 넣고 릴리스 브랜치로 체리픽하는 이유를 설명해 보라.
- 지금 다니는 팀 또는 프로젝트에 브랜치 전략을 도입한다면 무엇을 고르고 그 근거는 무엇인가.
Git과 협업에서 같이 읽기
- Node.js 프로젝트의 Git 협업node_modules와 .env는 제외하고 잠금 파일은 커밋하는 이유부터 npm ci, 기능 브랜치와 풀 리퀘스트 리뷰, 병합 전략까지 Node.js 팀의 표준 Git 협업 방식을 정리한다.
- Git 커밋 메시지 컨벤션커밋 메시지의 형식과 어휘를 통일하는 규칙을 다룬다. 제목, 본문, 꼬리말 구조와 컨벤셔널 커밋 타입 체계, commitlint와 husky로 컨벤션을 강제하는 방법까지 정리한다.
- GitHub Fork로 협업하기원본 저장소에 쓰기 권한이 없어도 포크한 내 저장소에서 작업하고 풀 리퀘스트로 기여하는 오픈 소스 협업 방식을 다룬다. upstream 등록과 동기화, 공유 저장소 방식과의 비교까지 정리한다.
- GitHub 저장소 미러링모든 브랜치와 태그를 다른 원격 저장소에 그대로 복제하는 미러링을 다룬다. git clone --mirror와 push --mirror 절차, 동기화 자동화, LFS와 메타데이터 관련 주의사항을 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기