Files
2nd/10_Wiki/Topics/Git Workflow.md
T

10 KiB

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: developrelease 등 다수의 브랜치를 운영하며 스케줄된 릴리스를 관리하는 대규모 프로젝트에 적합하지만, 소규모 팀에게는 너무 복잡하고 무거울 수 있습니다 [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

[관계 유형 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