Git Flow
Git Flow 는 Vincent Driessen 이 2010 년 제안한 Git 브랜치 관리 전략으로, 프로젝트의 개발, 릴리스, 유지보수를 효과적으로 수행할 수 있도록 고안되었다. 각 브랜치의 역할을 명확히 정의하여 협업과 코드 품질을 향상시킨다. 주요 브랜치로는 main
, develop
, feature
, release
, hotfix
가 있으며, 각 브랜치는 특정 목적에 따라 생성되고 병합된다.
핵심 개념
브랜치 기반의 워크플로우 모델로, 각 브랜치가 명확한 목적과 생명주기를 가지고 있다. 이를 통해 기능 개발, 릴리즈 준비, 버그 수정 등의 작업을 체계적으로 관리할 수 있다.
- 두 가지 메인 브랜치:
main
(master): 안정적인 프로덕션 코드 보유.develop
: 다음 릴리스를 위한 개발 통합 브랜치.
- 보조 브랜치:
feature/*
: 기능 개발.release/*
: 릴리스 준비.hotfix/*
: 긴급 프로덕션 버그 수정.
목적
- 명확한 브랜치 관리 체계 제공
- 개발과 배포 프로세스의 표준화
- 팀 협업 효율성 향상
- 안정적인 릴리즈 관리 지원
필요성
- 대규모 팀에서의 동시 개발 관리
- 배포 버전의 안정성 보장
- 긴급 버그 수정의 신속한 처리
- 기능 개발과 유지보수의 분리
특징
- 5 가지 브랜치 타입 사용
- 명확한 브랜치 생명주기
- Pull Request 중심의 코드 리뷰
- 자동화 도구 지원 (git-flow 확장)
주요 기능
- 병렬 개발 지원
- 릴리즈 준비 프로세스 제공
- 긴급 수정사항 처리 메커니즘
- 버전 태깅 및 관리
역할
- 개발 워크플로우 표준화
- 브랜치 관리 체계화
- 릴리즈 프로세스 자동화
- 팀 협업 가이드라인 제공
장점과 단점
구분 | 항목 | 설명 |
---|---|---|
✅ 장점 | 구조화된 협업 | 기능/릴리스/핫픽스 브랜치 분리로 병렬 개발 가능 |
예측 가능한 릴리스 | 릴리스 브랜치를 통한 체계적인 배포 관리 | |
안정성 보장 | Main (Master) 브랜치는 항상 배포 가능한 상태 유지 | |
긴급 대응 | Hotfix 를 통한 신속한 프로덕션 버그 수정 | |
⚠ 단점 | 복잡성 | 브랜치 종류와 머지 규칙이 많아 학습 곡선 가파름 |
오버헤드 | 소규모 프로젝트에는 과도한 프로세스 | |
CI/CD 부적합 | 장기간 브랜치 유지로 지속적 통합 어려움 | |
병합 충돌 위험 | 장기간 유지되는 feature 브랜치로 인한 충돌 가능성 |
주요 원리
Git Flow 의 주요 원리는 다음과 같은 다이어그램으로 시각화할 수 있다:
작동 원리
|
|
develop
브랜치에서feature
브랜치를 생성하여 기능 개발을 진행한다.- 기능 개발 완료 후
feature
브랜치를develop
에 병합한다. - 릴리스를 준비할 때
develop
에서release
브랜치를 생성하여 최종 테스트 및 버그 수정을 진행한다. release
브랜치를main
과develop
에 병합하고,main
에는 버전 태그를 추가한다.- 프로덕션에서 긴급 버그가 발생하면
main
에서hotfix
브랜치를 생성하여 수정한 후, 이를main
과develop
에 병합한다.
graph TD main[main 브랜치] -->|분기| develop[develop 브랜치] develop -->|분기| feature[feature/기능] develop -->|분기| release[release/버전] main -->|분기| hotfix[hotfix/버그] feature -->|병합| develop release -->|병합| main & develop hotfix -->|병합| main & develop
핵심 원칙
master(main)
브랜치는 항상 배포 가능한 상태로 유지- 모든 개발은
develop
브랜치를 기반으로 진행 - 새로운 기능 개발은 항상
feature
브랜치에서 수행 release
브랜치는 릴리즈 준비가 완료된 후에만master
로 병합
주요 브랜치 및 역할
브랜치 유형 | 설명 | |
---|---|---|
장기 | main (Master) | 프로덕션 배포용 브랜치로, 항상 안정적인 상태를 유지해야 하며 태그를 통해 버전을 관리합니다. |
develop | 다음 릴리스를 위한 개발 브랜치로, 기능 브랜치들이 병합됩니다. 지속적 통합을 위한 기준 브랜치입니다. | |
단기 | feature | 새로운 기능 개발을 위한 브랜치로, develop 에서 분기하여 작업 후 다시 develop 에 병합됩니다. |
release | 릴리스 준비를 위한 브랜치로, 버그 수정 및 문서화 등을 진행한 후 main 과 develop 에 병합됩니다. | |
hotfix | 프로덕션에서 발생한 긴급 버그 수정을 위한 브랜치로, main 에서 분기하여 수정 후 main 과 develop 에 병합됩니다. |
아키텍처 다이어그램:
|
|
브랜치 관리 전략
브랜치 생명주기 관리
브랜치 | 역할 | 생성 시점 | 종료 조건 |
---|---|---|---|
main | 운영 환경 (Production) 반영 코드 | 최초 프로젝트 생성 시 | 지속적으로 유지 |
develop | 모든 개발 기능 통합, QA 전 코드 베이스 | 프로젝트 초기 | 지속적으로 유지 |
feature/* | 개별 기능 단위 개발 | 새로운 기능 개발 시작 시 | develop 에 병합 후 삭제 |
release/* | QA, 문서화, 최종 버그 수정 | 릴리즈 준비 시작 시 | main, develop 에 병합 후 삭제 |
hotfix/* | 운영 긴급 패치 | 운영 이슈 발생 시 | main, develop 에 병합 후 삭제 |
브랜치 관리 모범 사례
구분 | 모범 사례 | 이유 |
---|---|---|
명명 규칙 | feature/기능명 : feature/login-system release/버전 : release/2.0 hotfix/버그 식별자 사용 : hotfix/security-patch | 일관성 있는 명명으로 브랜치 목적 명확화 |
브랜치 수명 | 가능한 한 짧게 유지 | 병합 충돌 최소화 및 코드 통합 촉진 |
코드 리뷰 | 모든 PR 에 대해 필수적으로 실시 | 코드 품질 보장 및 지식 공유 |
자동화 | CI/CD 파이프라인 구축 | 테스트 및 배포 프로세스 자동화 |
정기 정리 | 사용 완료된 브랜치 즉시 삭제 | 저장소 정리 및 혼란 방지 |
원격 저장소 동기화
- 푸시 규칙:
- master 와 develop 브랜치는 정기적으로 원격에 푸시
- feature 브랜치는 협업 필요 시에만 선택적으로 원격에 푸시
- release 와 hotfix 브랜치는 팀 전체가 테스트할 수 있도록 원격에 푸시
- 풀 규칙:
- 작업 시작 전 항상 해당 브랜치의 최신 상태를 가져옴
- 예:
git pull origin develop
Release 버전 관리 방식
버전 관리 체계: Semantic Versioning(SemVer) 을 사용
|
|
- 주 버전 (Major): 호환성이 깨지는 변경사항
- 부 버전 (Minor): 기능 추가
- 패치 버전 (Patch): 버그 수정
예: 1.2.3 (주 버전 1, 부 버전 2, 패치 3)
태그 관리:
- 모든 릴리즈에 태그 부여
- 버전 정보 포함
- 릴리즈 노트 연결
이력 관리:
- 릴리즈 노트 작성
- 변경 이력 문서화
- 주요 변경 사항 추적
Release Note
Release Note 는 소프트웨어 버전별 변경점, 개선사항, 버그 수정 내역 등을 정리한 문서이다.
Git Flow 에서 release 시 릴리즈 노트는 수동 작성 (커밋/문서/릴리즈 메뉴) 또는 자동화 도구 (GitHub Actions, Release Drafter 등) 로 적용할 수 있다. 자동화 시 커밋 로그를 기반으로 릴리즈 노트와 태그를 생성해 반복 작업을 줄이고, 일관성 있는 릴리즈 관리를 할 수 있다.
수동 작성 방식:
- release 브랜치에서 변경사항을 커밋할 때, 커밋 메시지나 별도의 문서 (예:
RELEASE_NOTE.md
) 에 릴리즈 노트를 직접 작성할 수 있다. - 마크다운 (Markdown) 문법을 활용해 릴리즈 노트를 정리하면 가독성이 높아진다.
- 릴리즈 브랜치 병합 (PR, MR) 시 리뷰 단계에서 릴리즈 노트가 포함됐는지 확인하는 것도 좋은 방법이다.
- release 브랜치에서 변경사항을 커밋할 때, 커밋 메시지나 별도의 문서 (예:
GitHub/GitLab Release 기능 활용:
- 브랜치 병합 후, GitHub 나 GitLab 의 Releases 메뉴에서 “Create a new release” 버튼을 클릭해 태그와 함께 릴리즈 노트를 작성할 수 있다.
- 이때, 주요 변경사항, 버전, 날짜, 개선점, 버그 수정 내역 등을 항목별로 정리한다.
- 수동으로 PR 제목, 커밋 메시지 등을 복사해 붙여넣을 수 있지만, 이 과정은 번거롭고 누락 위험이 있다.
자동화 도구 (Release Drafter, GitHub Actions 등) 활용:
- 반복적인 릴리즈 노트 작성과 태깅 작업을 자동화할 수 있다.
- Release Drafter: PR 이 병합될 때마다 자동으로 릴리즈 노트 초안을 작성해준다.
.github/workflows/release-drafter.yml
워크플로와.github/release-drafter.yml
설정 파일을 활용해 자동화할 수 있다.
- GitHub Actions:
- 예를 들어,
tag-release.yml
같은 워크플로 파일을 만들어, release 브랜치가 prod(main) 로 병합될 때 자동으로 버전 태그를 만들고, 이전 태그 이후의 커밋 메시지를 모아 릴리즈 노트를 생성할 수 있다. - 주요 단계:
- prod/main 브랜치로 push 감지
- release 브랜치명에서 버전 추출
- 이전 태그와 HEAD 사이 커밋 메시지 추출
- 태그 생성 및 푸시
- 릴리즈 생성 및 노트 자동 등록
- 예를 들어,
릴리즈 노트를 작성할 때 다음 사항들을 유의해야 한다:
- 버전, 날짜, 변경 구분 (Tag), 주요 변경점, 알려진 이슈 (known issues) 등 항목별로 구분해 작성한다.
- 구체적이고 간결하게, 일관된 용어로 작성하며, 사용자 관점에서 쉽게 이해할 수 있도록 한다.
- 자동화 도구를 쓰더라도, 중요한 이슈나 추가 설명은 수동으로 보완하는 것이 좋다.
실무 예시: GitHub Actions 자동화 워크플로:
|
|
- 위 예시는 브랜치 병합 시 자동으로 태그와 릴리즈 노트가 생성되는 전체 흐름을 보여준다.
Git Flow 시작하기
Git 이 설치되어 있어야 하며, Git Flow 는 별도 확장 도구로 설치해야 한다.
1. Git Flow 확장 도구 설치
Git Flow 확장 도구가 설치되어 있다면, 이 과정은 건너뛰어도 무방하다.
macOS
Ubuntu/Debian
Windows
2. 프로젝트에서 Git Flow 초기화
기존 프로젝트라면 해당 디렉터리로 이동, 새 프로젝트라면 git init
으로 저장소를 생성한다.
예시:
3. 원격 저장소 생성 및 연결 (선택)
GitHub 에서 저장소 생성
- GitHub.com 에 로그인
- “New repository” 클릭
- Repository name:
my-ecommerce-project
- Initialize 옵션 모두 체크 해제 (이미 로컬에서 초기화했음)
- “Create repository” 클릭
원격 저장소가 생성되어 있다면 생성 과정을 생략하고 연결한다.
원격 저장소 연결
3. Git Flow 초기화
프로젝트 루트에서 아래 명령어 실행:
1
git flow init
Git Flow 를 초기화하면 다음과 같은 질문들이 나타난다:
실행하면 다음과 같이 브랜치 및 접두사 설정을 순서대로 묻는다.
|
|
각 질문에 대한 설명:
- Production releases: 실제 배포되는 안정된 코드가 있는 브랜치 (기본값: master)
- Next release development: 다음 릴리스를 위한 개발이 진행되는 브랜치 (기본값: develop)
- Feature branches: 새로운 기능 개발을 위한 브랜치 접두사 (기본값: feature/)
- Release branches: 릴리스 준비를 위한 브랜치 접두사 (기본값: release/)
- Hotfix branches: 긴급 버그 수정을 위한 브랜치 접두사 (기본값: hotfix/)
- Support branches: 이전 버전 지원을 위한 브랜치 접두사 (기본값: support/)
- Version tag prefix: 버전 태그 접두사 (예: v1.0.0)
질문에 답변을 완료하면 자동으로 아래 작업이 수행된다:
develop
브랜치가 없으면 생성develop
브랜치로 자동 체크아웃
브랜치 구조 (main, develop 등) 와 브랜치 접두사 (feature/, release/ 등) 설정 정보를 .git/config 파일 내 [gitflow "branch"]
및 [gitflow "prefix"]
섹션에 저장한다.
4. 기본 브랜치 구조 설정
git branch
명령으로main
과develop
브랜치가 생성된 것을 확인할 수 있다.
5. GitHub 에서 브랜치 보호 규칙 설정
- GitHub 저장소 설정으로 이동
- GitHub 저장소 페이지 방문
- Settings 탭 클릭
- 좌측 메뉴에서 “Branches” 선택
- 기본 브랜치 변경 (선택사항)
- Default branch 섹션에서 스위치 아이콘 클릭
develop
을 기본 브랜치로 선택 (팀 정책에 따라)- “Update” 클릭
- 브랜치 보호 규칙 설정
- main 브랜치 보호
- “Add branch protection rule” 클릭
- Branch name pattern:
main
- 다음 옵션들 선택:
- ✅ Require a pull request before merging
- ✅ Require approvals (최소 1 명)
- ✅ Require status checks to pass before merging
- ✅ Require branches to be up to date before merging
- ✅ Require conversation resolution before merging
- ✅ Include administrators
- ✅ Restrict who can push to matching branches
- “Create” 클릭
- Develop 브랜치 보호
- “Add branch protection rule” 클릭
- Branch name pattern:
develop
- 다음 옵션들 선택:
- ✅ Require a pull request before merging
- ✅ Require approvals (최소 1 명)
- ✅ Require status checks to pass before merging
- ✅ Include administrators
- “Create” 클릭
- main 브랜치 보호
6. Git Flow 사용 시작
팀원이 저장소 클론하고 Git Flow 설정하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 저장소 클론 git clone https://github.com/username/my-ecommerce-project.git cd my-ecommerce-project # 모든 원격 브랜치 확인 git branch -r # 출력: # origin/HEAD -> origin/main # origin/develop # origin/main # develop 브랜치 체크아웃 git checkout develop # Git Flow 초기화 (-d 옵션으로 기본값 사용) git flow init -d
Feature 브랜치 워크플로우
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
# 새 기능 시작 git flow feature start login-system # 작업 수행 git add . git commit -m "feat: implement login system" # 원격에 feature 브랜치 푸시 git push -u origin feature/login-system # GitHub에서 Pull Request 생성 # 1. GitHub 저장소로 이동 # 2. "Compare & pull request" 버튼 클릭 # 3. base: develop, compare: feature/login-system # 4. PR 설명 작성 후 "Create pull request" # 코드 리뷰 후 PR이 승인되면 # GitHub에서 "Merge pull request" 클릭 # 로컬에서 develop 업데이트 git checkout develop git pull origin develop # feature 브랜치 정리 git flow feature finish login-system
release 준비
긴급 수정 (hotfix)
Git Flow 를 활용한 예시
Git Flow 를 활용한 예시에 대한 다이어그램:
|
|
실제 개발 시나리오: E-commerce 플랫폼 개발
온라인 쇼핑몰 플랫폼을 개발하는 시나리오이다. 다이어그램에 표시된 대로 v0.1.0(MVP) 에서 시작하여 v1.0.0 출시를 준비하고, 긴급 보안 패치를 적용한 후 다음 기능들을 개발하는 과정을 보여준다.
초기 상태 (v0.1.0)
- 기본 상품 목록 및 상세 페이지
- 간단한 장바구니 기능
- 회원가입/로그인 기본 기능
1. 새로운 기능 개발: 결제 API 통합
1.1 Feature 브랜치 생성
1.2 개발 작업
첫 번째 커밋: Stripe API 설정
두 번째 커밋: 결제 프로세스 구현
세 번째 커밋: 결제 UI 컴포넌트 추가
|
|
1.3 Feature 브랜치 머지
2. 릴리즈 준비: V1.0.0
2.1 Release 브랜치 생성
2.2 QA 및 버그 수정 작업
첫 번째 버그 수정
두 번째 버그 수정
세 번째 작업: 문서 업데이트
네 번째 작업: 성능 최적화
다섯 번째 작업: 버전 번호 업데이트
2.3 Release 완료
|
|
3. 핫픽스 처리: 보안 패치
3.1 긴급 보안 이슈 발견
프로덕션에서 XSS 취약점이 발견되어 긴급 패치가 필요하다.
3.2 Hotfix 브랜치 생성
3.3 보안 패치 적용
첫 번째 커밋: XSS 취약점 수정
두 번째 커밋: 보안 테스트 추가
3.4 Hotfix 완료
|
|
4. 다음 기능 개발 주기
4.1 Feature 1: 사용자 프로필 기능
|
|
4.2 Feature 2: 알림 시스템 (병렬 개발)
|
|
브랜치 전략별 적용 시나리오
시나리오별로 Git flow 브랜치 전략에서 Local Repository(로컬 저장소) 와 Remote Repository(원격 저장소) 에서의 구체적인 워크플로우와 브랜치 생명주기, 그리고 각 작업 흐름의 다이어그램이다.
각각의 시나리오에서
- 모든 브랜치는 로컬에서 생성 후 원격에 푸시, 협업을 위해 원격에서 병합 및 삭제 관리.
- release, hotfix 브랜치는 master 와 develop 양쪽에 병합, 태그로 버전 관리
- 여러 팀 협업, 대규모 리팩토링 등은 브랜치 네이밍과 병합 전략으로 유연하게 대응
새로운 기능 개발 (feature 브랜치)
적용 방법:
- feature 브랜치 생성 → 개발 → develop 병합
예시:
- feature/user-authentication 브랜치에서 로그인 기능 개발
워크플로우:
로컬 (Local)
develop
브랜치 최신화:git checkout develop && git pull
- feature 브랜치 생성:
git checkout -b feature/user-authentication
- 기능 개발 및 커밋:
git add. && git commit -m "Add login feature"
원격 (Remote)
- feature 브랜치 푸시:
git push -u origin feature/user-authentication
- Pull Request(PR) 생성 또는 직접 develop 에 병합 요청
- 코드 리뷰 후 develop 에 병합 (로컬 또는 원격 PR)
- 병합 후 feature 브랜치 삭제:
git branch -d feature/user-authentication
(로컬)git push origin --delete feature/user-authentication
(원격)
- feature 브랜치 푸시:
생명주기:
생성 (로컬) → 개발 (로컬) → 푸시 (원격) → 병합 (원격/로컬) → 삭제 (로컬/원격)
다이어그램:
버전 릴리즈 준비 (release 브랜치)
적용 방법:
- release 브랜치 생성 → QA → master/develop 병합
예시:
- release/v2.0.0 브랜치에서 최종 테스트 및 버그 수정
워크플로우:
로컬 (Local)
develop
최신화:git checkout develop && git pull
- release 브랜치 생성:
git checkout -b release/v2.0.0
- QA, 버그 수정, 문서화 등 진행 및 커밋
원격 (Remote)
- release 브랜치 푸시:
git push -u origin release/v2.0.0
- QA 완료 후 master 와 develop 에 병합 (PR 또는 직접 병합)
- master 에 태그 부착:
git tag -a v2.0.0 -m "Release v2.0.0"
- master, develop, 태그 푸시:
git push origin master develop --tags
- release 브랜치 삭제:
git branch -d release/v2.0.0
(로컬)git push origin --delete release/v2.0.0
(원격)
- release 브랜치 푸시:
생명주기:
- 생성 (로컬) → QA/수정 (로컬/원격) → 병합 (원격/로컬) → 태깅 (로컬/원격) → 삭제 (로컬/원격)
다이어그램:
프로덕션 긴급 버그 수정 (hotfix 브랜치)
적용 방법:
- hotfix 브랜치 생성 → 수정 → master/develop 병합
예시:
- hotfix/critical-security-patch 로 보안 이슈 해결
워크플로우:
로컬 (Local)
master
최신화:git checkout master && git pull
- hotfix 브랜치 생성:
git checkout -b hotfix/critical-security-patch
- 버그 수정 및 커밋
원격 (Remote)
- hotfix 브랜치 푸시:
git push -u origin hotfix/critical-security-patch
- 수정 완료 후 master 와 develop 에 병합 (PR 또는 직접 병합)
- master 에 태그 부착:
git tag -a v2.0.1 -m "Hotfix v2.0.1"
- master, develop, 태그 푸시:
git push origin master develop --tags
- hotfix 브랜치 삭제:
git branch -d hotfix/critical-security-patch
(로컬)git push origin --delete hotfix/critical-security-patch
(원격)
- hotfix 브랜치 푸시:
생명주기:
- 생성 (로컬) → 수정 (로컬) → 푸시 (원격) → 병합 (원격/로컬) → 태깅 (로컬/원격) → 삭제 (로컬/원격)
다이어그램:
여러 팀 협업 (팀별 Feature 브랜치)
적용 방법:
- 각 팀별 feature 브랜치 운영 → develop 에서 통합
예시:
- team-a/feature-x, team-b/feature-y 로 병렬 개발
워크플로우:
로컬 (Local)
- 각 팀별로 develop 에서 브랜치 생성:
git checkout develop && git checkout -b team-a/feature-x
- 각자 개발 및 커밋
- 각 팀별로 develop 에서 브랜치 생성:
원격 (Remote)
- 각 팀별 브랜치 푸시:
git push -u origin team-a/feature-x
- PR 또는 직접 develop 에 병합
- 병합 후 브랜치 삭제
- 각 팀별 브랜치 푸시:
생명주기:
- 생성 (로컬) → 개발 (로컬) → 푸시 (원격) → 병합 (원격/로컬) → 삭제 (로컬/원격)[4]
다이어그램:
대규모 리팩토링 (장기 Feature 브랜치)
적용 방법:
- 장기 feature 브랜치 생성 → 점진적 개발 → 통합
예시:
- feature/architecture-refactoring 으로 장기 프로젝트 진행
워크플로우:
로컬 (Local)
- develop 에서 브랜치 생성:
git checkout develop && git checkout -b feature/architecture-refactoring
- 점진적으로 개발, 커밋, 주기적으로 develop 의 변경사항 병합
- develop 에서 브랜치 생성:
원격 (Remote)
- 브랜치 푸시:
git push -u origin feature/architecture-refactoring
- 병합 전 develop 최신화 및 충돌 해결
- PR 또는 직접 develop 에 병합
- 병합 후 브랜치 삭제
- 브랜치 푸시:
생명주기:
- 생성 (로컬) → 장기 개발 (로컬/원격) → develop 병합 (원격/로컬) → 삭제 (로컬/원격)
다이어그램:
API 버전 관리 (release 브랜치에서 API 버전 태깅)
적용 방법:
- release 브랜치에서 API 버전 태깅 → 배포
예시:
- release/api-v3.0 에서 새로운 API 버전 준비
워크플로우:
로컬 (Local)
- develop 에서 release 브랜치 생성:
git checkout develop && git checkout -b release/api-v3.0
- API 버전 준비, QA, 문서화 등
- develop 에서 release 브랜치 생성:
원격 (Remote)
- 브랜치 푸시:
git push -u origin release/api-v3.0
- QA 완료 후 master 와 develop 에 병합, master 에 태그 부착
git tag -a api-v3.0 -m "API v3.0 Release"
- master, develop, 태그 푸시
git push origin master develop --tags
- release 브랜치 삭제
- 브랜치 푸시:
생명주기:
- 생성 (로컬) → 개발/QA(로컬/원격) → master/develop 병합 (원격/로컬) → 태깅 (로컬/원격) → 삭제 (로컬/원격)[8]
다이어그램:
실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점
고려사항 | 상세 내용 | 권장 사항 |
---|---|---|
브랜치 이름 규칙 | 일관된 네이밍 컨벤션 적용 | feature/지라티켓번호 - 기능명 형식 사용 |
커밋 메시지 규칙 | 명확하고 구조화된 커밋 메시지 작성 | conventional commits 규칙 적용 |
코드 리뷰 프로세스 | PR 을 통한 철저한 코드 리뷰 수행 | 최소 2 명 이상의 리뷰어 지정 |
자동화 도구 활용 | CI/CD 파이프라인과 통합 | Jenkins, GitHub Actions 등 활용 |
브랜치 수명 관리 | feature 브랜치의 생명주기 최소화 | 2 주 이내 완료 목표 |
충돌 해결 전략 | 정기적인 develop 브랜치 동기화 | 매일 develop 브랜치 변경사항 반영 |
릴리즈 일정 관리 | 명확한 릴리즈 스케줄 수립 | 2-4 주 주기의 정기 릴리즈 계획 |
핫픽스 프로세스 | 긴급 수정 절차 문서화 | 핫픽스 승인 절차 및 책임자 지정 |
문서화 | Git Flow 프로세스 문서화 및 교육 | 온보딩 문서 작성 및 정기 교육 |
모니터링 | 브랜치 활동 및 병합 상태 모니터링 | Git 분석 도구 활용 |
최적화하기 위한 고려사항 및 주의할 점
최적화 영역 | 문제점 | 해결 방안 |
---|---|---|
브랜치 관리 | 오래된 브랜치로 인한 저장소 크기 증가 | 정기적인 브랜치 정리 스크립트 실행 |
빌드 시간 | feature 브랜치별 빌드로 CI 부하 증가 | 캐싱 전략 및 증분 빌드 도입 |
병합 효율성 | 대규모 병합으로 인한 충돌 및 지연 | 작은 단위의 자주 병합, feature flag 활용 |
테스트 실행 | 모든 브랜치에서 전체 테스트 실행시 오버헤드 | 영향 범위 기반 선택적 테스트 실행 |
저장소 성능 | 많은 브랜치로 인한 fetch/pull 속도 저하 | shallow clone 활용, 로컬 브랜치 정리 |
코드 리뷰 속도 | PR 크기가 커서 리뷰 시간 증가 | PR 크기 제한 (300 줄 이하), 단계적 리뷰 |
배포 자동화 | 수동 배포로 인한 지연 및 오류 | 브랜치별 자동 배포 파이프라인 구축 |
충돌 예방 | 장기 브랜치로 인한 대규모 충돌 | 일일 리베이스 또는 머지 정책 |
리소스 사용 | 동시 다발적 브랜치 작업으로 서버 부하 | 브랜치별 리소스 할당 및 스케줄링 |
모니터링 오버헤드 | 많은 브랜치로 인한 모니터링 복잡성 | 중요 브랜치 위주 모니터링, 알람 임계치 설정 |
팀 협업을 위한 설정
CONTRIBUTING.md 파일 생성
오픈소스 프로젝트의 저장소 (Repository) 루트에 위치하는 기여 가이드 문서이다. 이 파일은 해당 프로젝트에 기여 (코드, 문서, 이슈, PR 등) 를 원하는 사람들에게 기여 방법, 절차, 규칙, 코드 스타일, 브랜치 전략, 커밋 메시지 작성법 등 구체적인 안내를 제공한다.
|
|
Git Hooks 설정
pre-commit 훅을 사용하여 코드 품질 검사:
|
|
팀원 온보딩 프로세스
새 팀원을 위한 설정 가이드
|
|
팀 규칙 문서화
팀 Wiki 또는 README 에 다음 내용 포함:
프로세스 | 단계 | 상세 설명 | 명령어 예시 |
---|---|---|---|
브랜치 전략 | |||
master | • 프로덕션 코드 • 항상 배포 가능한 상태 • 직접 커밋 금지 | git checkout master | |
develop | • 개발 중인 코드 • 다음 릴리스를 위한 통합 브랜치 • 모든 기능이 이곳에 병합 | git checkout develop | |
feature/* | • 기능 개발 • develop 에서 분기 • 완료 후 develop 으로 병합 | git checkout -b feature/user-auth | |
release/* | • 릴리스 준비 • develop 에서 분기 • 버그 수정과 버전 업데이트만 | git checkout -b release/1.2.0 | |
hotfix/* | • 긴급 수정 • master 에서 분기 • 완료 후 master 와 develop 에 병합 | git checkout -b hotfix/security-patch | |
코드 리뷰 프로세스 | |||
1. PR 생성 | • 모든 feature 는 PR 을 통해 develop 에 병합 • PR 템플릿 사용 • 충분한 설명 포함 | gh pr create --base develop | |
2. 리뷰 진행 | • 최소 1 명의 리뷰어 승인 필요 • 코드 스타일 검토 • 로직 검증 | GitHub UI 에서 진행 | |
3. 자동화 검사 | • CI 통과 필수 • 테스트 실행 • Lint 검사 • 빌드 성공 | 자동 실행 | |
4. 병합 | • 모든 검사 통과 후 병합 • Squash and merge 권장 | GitHub UI 에서 진행 | |
릴리스 프로세스 | |||
1. 브랜치 생성 | • release 브랜치 생성 • develop 에서 분기 | git flow release start 1.2.0 | |
2. QA 테스트 | • QA 팀 테스트 수행 • 버그 발견 시 수정 • 회귀 테스트 실행 | 테스트 환경에 배포 | |
3. 버전 업데이트 | • 버전 번호 업데이트 • CHANGELOG 작성 • 문서 업데이트 | npm version 1.2.0 | |
4. 병합 및 태그 | • master 와 develop 에 병합 • 버전 태그 생성 • 배포 실행 | git flow release finish 1.2.0 | |
긴급 수정 프로세스 | |||
1. 브랜치 생성 | • hotfix 브랜치 생성 • master 에서 분기 | git flow hotfix start 1.2.1 | |
2. 긴급 수정 | • 최소한의 변경만 수행 • 문제의 직접적인 해결 • 테스트 필수 | 코드 수정 | |
3. 신속한 병합 | • 즉시 master 와 develop 에 병합 • 긴급 배포 실행 • 팀 공지 | git flow hotfix finish 1.2.1 |
최신 동향
주제 | 항목 | 설명 |
---|---|---|
AI 통합 | 자동 머지 충돌 해결 | 머신러닝 기반 충돌 예측 및 해결 제안 |
Git Flow 채택 현황 | 감소 추세 | 트렁크 기반 개발 (Trunk-based Development) 이 더 선호되는 추세 |
CI/CD 통합 | 호환성 과제 | Git Flow 가 지속적 배포 환경에서 복잡성으로 인해 부적합하다는 인식 증가 |
대안 워크플로우 | GitHub Flow 선호 | 더 단순한 워크플로우인 GitHub Flow 가 웹 애플리케이션에 더 적합 |
자동화 강화 | 브랜치 관리 자동화 | Mergify, GitHub Actions 등을 통한 브랜치 관리 프로세스 자동화 |
변형된 Git Flow | 간소화 버전 | 특정 브랜치 제거하여 복잡성을 줄인 변형 버전 사용 증가 |
코드 리뷰 강화 | PR 중심 리뷰 | Pull Request 를 중심으로 한 철저한 코드 리뷰 프로세스 강조 |
브랜치 전략 유연화 | 프로젝트별 최적화 | 프로젝트 규모와 특성에 따른 맞춤형 브랜치 전략 수립 |
도구 생태계 발전 | UI 기반 관리 | GitKraken, SourceTree 등 GUI 도구를 통한 Git Flow 관리 간소화 |
주목해야 할 기술
주제 | 항목 | 설명 |
---|---|---|
브랜치 전략 | Trunk-based Development | Git Flow 보다 단순하고 CI/CD 에 최적화되어 인기 상승 |
GitHub 대안 | GitLab | 종합적인 DevOps 기능과 자체 호스팅 옵션으로 주목 |
간소화 워크플로우 | GitHub Flow | 웹 애플리케이션 개발에 적합한 간단한 브랜치 전략 |
환경별 브랜치 | GitLab Flow | 스테이징 환경 분리와 다중 환경 관리에 특화 |
자동화 도구 | Mergify | 코드 병합 자동화, PR 우선순위 관리, 병합 큐 기능 |
GUI 도구 | GitKraken | Git Flow 설정 커스터마이징과 시각적 관리 도구 |
코드 리뷰 플랫폼 | Bitbucket | Atlassian 생태계 통합과 무제한 프라이빗 저장소 제공 |
경량 Git 서버 | Gitea | 소규모 팀을 위한 무료 오픈소스 Git 호스팅 솔루션 |
클라우드 통합 | Azure Repos | Microsoft 생태계와의 강력한 통합 및 보안 기능 |
브랜치 관리 AI | AI 기반 브랜치 전략 | 프로젝트 특성에 따른 자동 브랜치 전략 추천 시스템 |
관련 학습 내용
하위 주제 | 설명 | 카테고리 |
---|---|---|
Git 내부 구조 | Git 의 객체 모델, 참조 시스템, 저장소 구조 이해 | Version Control Internals |
브랜치 전략 비교 | Trunk-based, GitHub Flow, GitLab Flow 상세 분석 | Branch Management |
CI/CD 파이프라인 | Git Flow 와 자동화 도구 통합 방법 | DevOps Integration |
Git 명령어 고급 | rebase, cherry-pick, stash 등 고급 명령어 활용 | Git Advanced Commands |
충돌 해결 전략 | 병합 충돌 예방 및 해결 기법 | Conflict Resolution |
Git Hook 활용 | 자동화 스크립트 구현 및 커스터마이징 | Automation Scripts |
대규모 저장소 관리 | 성능 최적화, 대용량 파일 처리 전략 | Repository Management |
Git 보안 | 코드 서명, 액세스 제어, 감사 로그 설정 | Security Practices |
릴리즈 관리 | 버전 관리, 태깅 전략, 변경 로그 자동화 | Release Management |
팀 협업 모범 사례 | 코드 리뷰, PR 템플릿, 커밋 컨벤션 설정 | Team Collaboration |
추가 관련 분야
관련 분야 | 설명 | 카테고리 |
---|---|---|
DevOps 문화 | 조직 문화 변화, 팀 구조 최적화 | DevOps Culture |
지속적 통합/배포 | Jenkins, GitHub Actions, GitLab CI 구축 및 운영 | CI/CD Tools |
컨테이너화 | Docker 와 Git 통합, 컨테이너 버전 관리 | Container Management |
클라우드 네이티브 | Kubernetes, 서비스 메시와 Git 워크플로우 연계 | Cloud Architecture |
인프라스트럭처 코드 | Terraform, Ansible 과 Git 통합 전략 | Infrastructure as Code |
마이크로서비스 | 분산 아키텍처에서의 Git 모노레포 vs 멀티레포 | Microservices Architecture |
API 버전 관리 | REST/GraphQL API 버전과 Git 브랜치 전략 연계 | API Development |
소프트웨어 품질 보증 | 정적 분석, 코드 커버리지와 Git 워크플로우 통합 | Quality Assurance |
프로젝트 관리 | Agile/Scrum 과 Git Flow 연계, 이슈 트래킹 통합 | Project Management |
보안 개발 생명주기 | DevSecOps, SAST/DAST 와 Git 통합 | Security Development |
용어 정리
용어 | 설명 |
---|---|
브랜치 (Branch) | Git 에서 독립적으로 개발을 진행할 수 있는 분기점입니다. |
병합 (Merge) | 하나의 브랜치에서 다른 브랜치로 변경 사항을 통합하는 작업입니다. |
Trunk-based Development | 단일 메인 브랜치 중심의 개발 방식으로, 짧은 수명의 기능 브랜치 사용 |
GitOps | Git 을 단일 진실 공급원으로 사용하여 인프라와 애플리케이션 배포를 관리하는 운영 모델 |
CI/CD | 지속적 통합 (Continuous Integration) 과 지속적 배포 (Continuous Deployment) 의 약자 |
Feature Flag | 코드를 배포하면서도 기능을 동적으로 활성화/비활성화할 수 있는 기술 |
Cherry-pick | 특정 커밋을 선택하여 다른 브랜치에 적용하는 Git 명령어 |
Rebase | 커밋 히스토리를 재정렬하거나 수정하는 Git 명령어 |
Pull Request (PR) | 코드 변경사항을 메인 브랜치에 병합하기 전 검토 요청 |
Semantic Versioning | 버전 번호를 Major.Minor.Patch 형식으로 관리하는 체계 |
DevSecOps | 개발, 보안, 운영을 통합한 소프트웨어 개발 방법론 |
Monorepo | 여러 프로젝트를 단일 저장소에서 관리하는 방식 |
태깅 | 특정 커밋에 버전 정보를 부여하는 작업 (ex. v1.0.0) |
태그 (Tag) | 특정 커밋에 이름을 붙여 릴리스 버전을 명시하는 기능입니다. |
릴리즈 노트 (Release Note) | 소프트웨어 버전별 변경점, 개선사항, 버그 수정 내역 등을 정리한 문서 |
태깅 (Tagging) | 특정 커밋에 버전 정보를 부여하는 Git 기능 |
Release Drafter | GitHub 에서 릴리즈 노트 자동 생성을 지원하는 오픈소스 액션 |
GitHub Actions | GitHub 저장소에서 자동화된 작업을 실행하는 워크플로 시스템 |
참고 및 출처
- Atlassian Gitflow Workflow
- A successful Git branching model - nvie.com
- GitKraken - Git Flow 설명
- Atlassian Git Tutorials - Gitflow Workflow
- Vincent Driessen - A successful Git branching model
- GitLab - What is GitLab Flow
- GitHub - Understanding the GitHub flow
- DevOps.com - Why GitOps Might Be the Future of DevOps
- GeeksforGeeks - The Future of Git: Trends and Predictions
- Harness.io - GitHub Flow vs. Git Flow: What’s the Difference?
- Graphite.dev - Top Git branching strategies
- Toptal - Trunk-based Development vs. Git Flow
- velog - git flow에서 릴리즈 노트 작성 팁
- POLEVED - 릴리즈 노트란? 작성법과 팁
- GitHub Actions로 자동 태깅 및 릴리즈 노트 자동화
- Release Drafter로 릴리즈 노트 자동화