# [[Git Workflow]]

## 📌 Brief Summary
Git Workflow(깃 워크플로우)는 팀 환경에서 코드 변경 사항을 관리하고 협업하기 위한 체계적이고 구조화된 접근 방식입니다 [1, 2]. 이는 기능 브랜치(Feature-branch), 트렁크 기반(Trunk-based), Git Flow 등 다양한 전략을 포괄하며, 충돌을 방지하고 `main` 브랜치의 배포 가능 상태를 보장하는 것을 목표로 합니다 [2-4]. 일관된 브랜치 명명 규칙, 커밋 메시지 규약, 풀 리퀘스트(PR)와 리뷰 절차를 도입함으로써 잠재적인 혼돈을 예측 가능한 릴리스 흐름으로 전환할 수 있습니다 [1, 5, 6].

## 📖 Core Content
*   **주요 브랜칭 전략 (Main Branching Strategies):**
    *   **Feature-Branch Workflow (기능 브랜치 워크플로우):** 주 브랜치(`main`)를 항상 안정적이고 배포 가능한 상태로 유지하며, 새로운 작업이나 버그 수정마다 짧은 수명의 기능 브랜치(예: `feature/login`)를 생성하여 작업합니다 [3, 4, 7]. 소규모 팀에 매우 적합하며, 오버헤드 없이 코드를 안전하게 통합할 수 있습니다 [4, 8].
    *   **Trunk-Based Development (트렁크 기반 개발):** 강력한 CI(지속적 통합) 환경을 갖춘 경험 많은 팀에 적합한 방식으로, 아주 짧은 수명의 브랜치를 사용해 자주 `main`에 코드를 병합하여 통합 속도를 높입니다 [8, 9].
    *   **Git Flow:** `develop` 및 `release` 등 다수의 브랜치를 운영하며 스케줄된 릴리스를 관리하는 대규모 프로젝트에 적합하지만, 소규모 팀에게는 너무 복잡하고 무거울 수 있습니다 [8, 10].
    *   **GitHub Flow:** 기능을 기능 브랜치에서 작업한 뒤 풀 리퀘스트를 통해 리뷰받고 병합하여, `main`에서 바로 배포하는 방식입니다 [11, 12].

*   **명명 규칙 및 추적성 (Naming Conventions & Traceability):**
    *   **브랜치 이름:** 브랜치 목적을 명확히 하기 위해 `feature/`, `bugfix/`와 같은 접두사를 사용하며, 티켓 ID를 함께 포함(예: `feature/PROJ-123-user-auth`)하여 이슈 트래커와의 추적성을 확보해야 합니다 [13-15]. 
    *   **커밋 메시지:** `type(scope): description` 형태를 따르는 "Conventional Commits" 규약을 사용하는 것이 좋습니다 [6, 16]. 예를 들어 새로운 기능은 `feat:`, 버그 수정은 `fix:`, 문서 수정은 `docs:` 등으로 시작하여 변경의 의도를 명확히 합니다 [6, 16].

*   **풀 리퀘스트와 병합 (Pull Requests & Merging):**
    *   `main` 브랜치에 직접 푸시(Push)하는 것을 금지하고, 반드시 풀 리퀘스트(PR)를 생성하여 최소 1명 이상의 동료에게 코드 리뷰를 받아야 합니다 [13, 17].
    *   코드 리뷰 속도와 품질을 위해 PR은 작고 논리적인 단일 변경 사항(Atomic Commits) 단위로 유지해야 합니다 [16, 18].
    *   병합 시에는 스쿼시 병합(Squash merge)을 사용하여 커밋 히스토리를 깔끔하게 유지하고, 병합이 완료된 기능 브랜치는 자동으로 삭제하여 리포지토리를 정리합니다 [17-19].

## ⚖️ Trade-offs & Caveats
*   **구조의 복잡성 vs. 팀의 규모:** Git Flow는 대규모의 복잡한 릴리스 계획을 안전하게 관리할 수 있지만, 프로세스 오버헤드가 크고 병합 지연을 초래합니다 [8, 20]. 반면, Feature-Branch 워크플로우나 Trunk-Based 방식은 소규모 팀이 빠르고 가볍게 움직일 수 있도록 돕지만, 규모가 커지거나 엄격한 릴리스 버전 관리가 필요한 경우 한계에 부딪힐 수 있어 워크플로우를 진화(Migration)시켜야 합니다 [8, 10].
*   **기능 브랜치의 수명과 충돌:** 기능 브랜치 방식의 가장 큰 부작용은 브랜치의 수명이 길어질 경우 메인 브랜치와의 차이가 커져 심각한 병합 충돌(Merge Conflict)이 발생한다는 점입니다 [20, 21]. 이를 피하기 위해 개발자는 자주 `main` 브랜치를 풀(Pull) 받거나 리베이스(Rebase)하여 최신 상태를 동기화하는 부가적인 작업을 수행해야 합니다 [19, 20].
*   **완전한 추적성의 대가:** 모든 브랜치와 커밋에 티켓 ID 부여를 강제하면 버그 추적이나 리뷰에 있어 컨텍스트 확보에는 탁월하나 [5, 22], 아주 단순하고 사소한 코드 수정 작업에도 반드시 티켓을 생성하고 절차를 밟아야 하는 속도 저하의 단점이 발생합니다 [23].
*   **Trunk-Based 전환의 전제 조건:** Trunk-Based Development로 전환하여 빠른 통합의 이점을 얻고자 한다면, 코드의 불안정성을 감추기 위한 기능 토글(Feature flags) 기법과 병합 전 결함을 잡아낼 강력한 테스트 자동화(CI)가 필수적으로 요구된다는 제약 사항이 있습니다 [12].

## 🔗 Knowledge Connections

### Related Concepts

#### [관계 유형 A (아키텍처/기반 기술)]
- `[[Trunk-Based Development]]`
  - 연결 이유: Git Workflow를 구성하는 핵심 전략 중 하나로, 빠른 통합을 목적으로 하는 방법론입니다 [2].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 짧은 수명의 브랜치, 빈번한 병합, 기능 플래그(Feature Flags) 활용이 프로젝트 배포 속도에 어떻게 기여하는지 이해할 수 있습니다 [9, 12].

- `[[Git Flow]]`
  - 연결 이유: 구조가 복잡한 대규모 프로젝트의 릴리스를 관리하기 위해 만들어진 전통적 브랜칭 모델입니다 [2, 10].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: `develop`, `release`, `hotfix` 등 다중 브랜치 전략이 왜 오버헤드를 유발하면서도 엔터프라이즈 환경에서 사용되는지 파악할 수 있습니다 [8, 10].

#### [관계 유형 B (구현/활용 도구)]
- `[[Conventional Commits]]`
  - 연결 이유: 팀의 일관된 코드베이스 히스토리 관리를 위해 Git 커밋 메시지 작성에 적용되는 업계 표준 규칙입니다 [6, 16].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: `feat:`, `fix:`, `chore:`와 같은 접두사가 리뷰어의 코드 이해도를 어떻게 높이고 자동화된 릴리스에 기여하는지 배울 수 있습니다 [6, 16].

- `[[Pull Requests (PR)]]`
  - 연결 이유: 브랜치의 코드를 `main`으로 병합하기 전, 협업 팀원들이 코드를 검토하는 핵심 관문입니다 [13, 16].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 브랜치 보호 설정, 동료 리뷰 요구(1 review required), 지속적 통합(CI) 체크가 시스템 안정성 유지에 어떻게 필수적으로 작용하는지 이해할 수 있습니다 [16, 17].

- `[[Ticket IDs (Traceability)]]`
  - 연결 이유: 코드의 변경 사항이 어떤 비즈니스 요구사항(예: Jira 티켓)에 의해 발생했는지를 연결하는 도구적 장치입니다 [5, 22].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: `PROJ-123` 형태의 티켓 번호를 브랜치와 커밋에 삽입함으로써 리뷰어에게 맥락을 제공하고, 문서화 및 작업 추적(Traceability)을 어떻게 달성하는지 알 수 있습니다 [5, 22].

### Deeper Research Questions
- 소규모 팀이 성장하여 복잡성이 증가할 때, Feature Branch Workflow에서 Git Flow로 안전하게 마이그레이션하려면 어떤 절차와 팀 내 교육이 필요한가?
- Trunk-Based Development를 효과적으로 도입하기 위해 CI/CD(지속적 통합/배포) 파이프라인에서 반드시 구성해야 하는 자동화 테스트 조건은 무엇인가?
- Conventional Commits 시스템과 연동하여 자동 릴리스 노트를 작성하고 시맨틱 버저닝(Semantic Versioning)을 구현하는 기술적 원리는 어떻게 작동하는가?
- 다수의 작업자가 겹치는 영역을 수정할 때 발생하는 Merge Conflict를 예방하기 위해, 'Atomic Commits'와 '자주 병합하기' 원칙은 실무에서 어떻게 구체적으로 적용되어야 하는가?
- 코드 리뷰의 병목 현상을 방지하기 위해 PR의 규모를 작게(예: 200줄 이하) 유지하면서도 논리적인 기능 단위를 훼손하지 않는 코드 분할 기법은 무엇인가?

### Practical Application Contexts
- **Implementation:** 새로운 작업을 시작할 때 무조건 `git checkout -b feature/티켓ID-작업명`으로 독립적인 브랜치를 파고, 완료 후 `feat:` 등의 규칙을 따른 커밋 메시지를 작성한 뒤 `main` 브랜치에 PR을 생성합니다 [6, 7, 13, 22].
- **System Design:** GitHub와 같은 호스팅 플랫폼에서 `main` 브랜치 보호(Branch Protection) 옵션을 활성화하여 직접 푸시를 막고, CI 빌드 통과와 최소 1인의 승인이 있어야 병합되도록 시스템을 설계합니다 [17].
- **Operation / Maintenance:** 브랜치가 병합될 때마다 스쿼시 병합(Squash and merge)을 강제하여 커밋 히스토리를 단일 항목으로 압축하고, 병합 후 남은 브랜치를 자동 삭제(Auto-delete) 설정하여 저장소를 깔끔하게 운영합니다 [17-19].
- **Learning Path:** Git에 입문하는 소규모 프로젝트의 경우, 복잡한 `develop` 브랜치 없이 `main` 브랜치 하나와 기능 브랜치들로만 구성된 가벼운 워크플로우(Feature-Branch Workflow)를 먼저 학습하고 체화하는 것이 권장됩니다 [4, 8].
- **My Project Relevance:** 현재 진행하는 3인 규모의 프로젝트 등에서는 Git Flow의 무거운 절차를 피하고, 항상 배포 가능한 안정적인 `main` 브랜치를 기준으로 짧은 기능 브랜치를 생성하여 빠른 리뷰와 피드백을 주고받는 방식을 즉각 도입할 수 있습니다 [4, 8].

### Adjacent Topics
- `[[CI/CD (Continuous Integration/Continuous Deployment)]]`
  - 확장 방향: PR을 생성하거나 병합할 때 코드를 자동으로 테스트하고 빌드, 배포하는 인프라 파이프라인 구성 방법론으로 확장하여 조사.
- `[[Semantic Versioning (SemVer)]]`
  - 확장 방향: Git 태그(Tag)와 Conventional Commits를 활용하여 소프트웨어의 버전을 체계적이고 일관성 있게 부여하는 방법으로 확장.

---
*Last updated: 2026-04-30*