# [[GitHub Flow]] ## πŸ“Œ Brief Summary GitHub FlowλŠ” λ³΅μž‘ν•œ Git Flow의 λŒ€μ•ˆμœΌλ‘œ μ‚¬μš©λ˜λŠ” 가볍고 λ‹¨μˆœν•œ 브랜치 기반 μ›Œν¬ν”Œλ‘œμš°μž…λ‹ˆλ‹€ [1, 2]. 이 방식은 항상 배포 κ°€λŠ₯ν•œ μƒνƒœ(deployable)λ₯Ό μœ μ§€ν•˜λŠ” `main` 브랜치λ₯Ό μ€‘μ‹¬μœΌλ‘œ μž‘λ™ν•˜λ©°, κ°œλ°œμžλŠ” μƒˆλ‘œμš΄ μž‘μ—…μ„ μœ„ν•΄ 짧은 주기의 κΈ°λŠ₯ 브랜치(feature branch)λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€ [3-5]. λ³€κ²½λœ μ½”λ“œλŠ” λ™λ£Œμ˜ μ½”λ“œ 리뷰와 CI/CD ν…ŒμŠ€νŠΈλ₯Ό λͺ¨λ‘ ν†΅κ³Όν•œ ν›„ 였직 Pull Request(PR)λ₯Ό ν†΅ν•΄μ„œλ§Œ `main`에 λ³‘ν•©λ©λ‹ˆλ‹€ [1, 6]. ## πŸ“– Core Content * **μ•ˆμ •μ μΈ `main` 브랜치 μœ μ§€** GitHub Flow의 핡심은 `main` (λ˜λŠ” `master`) λΈŒλžœμΉ˜κ°€ 항상 μ•ˆμ •μ μ΄κ³  μ–Έμ œλ“  배포 κ°€λŠ₯ν•œ μƒνƒœμ—¬μ•Ό ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€ [3-5]. κ°œλ°œμžλŠ” μ–΄λ– ν•œ κ²½μš°μ—λ„ `main` λΈŒλžœμΉ˜μ— 직접 컀밋(direct commit)ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€ [1, 6, 7]. * **κΈ°λŠ₯ 브랜치(Feature Branch) 기반 μž‘μ—…** λͺ¨λ“  μƒˆλ‘œμš΄ κΈ°λŠ₯ 개발, 버그 μˆ˜μ •, λ¬Έμ„œ μž‘μ—… 등은 `main`μ—μ„œ νŒŒμƒλœ 짧은 수λͺ…(short-lived)의 μ „μš© λΈŒλžœμΉ˜μ—μ„œ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [3-5]. 브랜치 이름은 `feature/user-auth` λ˜λŠ” `bugfix/login-error`와 같이 μ„€λͺ…적이어야 ν•˜λ©°, κ°€λŠ₯ν•˜λ©΄ ν‹°μΌ“ ID(예: `PROJ-123`)λ₯Ό ν¬ν•¨ν•˜μ—¬ 좔적성을 λ†’μ΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [8, 9]. * **Pull Request (PR) 및 μ½”λ“œ 리뷰** μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ `main` 브랜치둜 λ³‘ν•©ν•˜κΈ° μœ„ν•΄ PR을 μƒμ„±ν•©λ‹ˆλ‹€ [6, 10]. 병합 μ „μ—λŠ” λ°˜λ“œμ‹œ μ΅œμ†Œ 1λͺ… μ΄μƒμ˜ νŒ€μ›μ—κ²Œ μ½”λ“œ 리뷰(Peer Review)λ₯Ό λ°›μ•„μ•Ό ν•˜λ©°, CI/CD ν™˜κ²½μ—μ„œμ˜ μžλ™ν™” ν…ŒμŠ€νŠΈλ₯Ό 톡과해야 ν•©λ‹ˆλ‹€ [1, 6, 8]. μ΄λŠ” ν˜Όμžμ„œ 잘λͺ»λœ μ½”λ“œλ₯Ό λ³‘ν•©ν•˜λŠ” 것을 λ°©μ§€ν•˜λŠ” μ•ˆμ „μž₯μΉ˜μž…λ‹ˆλ‹€ [8]. * **병합 κ·œμΉ™κ³Ό 정리** 컀밋 νžˆμŠ€ν† λ¦¬λ₯Ό κΉ”λ”ν•˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•΄ PR을 병합할 λ•ŒλŠ” 'Squash Merge' 방식을 주둜 μ‚¬μš©ν•©λ‹ˆλ‹€ [6, 7, 11]. μ„±κ³΅μ μœΌλ‘œ λ³‘ν•©λœ μ΄ν›„μ—λŠ” λΆˆν•„μš”ν•œ λΈŒλžœμΉ˜κ°€ μŒ“μ΄μ§€ μ•Šλ„λ‘ κΈ°λŠ₯ 브랜치λ₯Ό μ¦‰μ‹œ μ‚­μ œ(auto-delete)ν•©λ‹ˆλ‹€ [6, 8, 11]. * **μ›Œν¬ν”Œλ‘œμš° λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ (Migration)** νŒ€μ΄ 기쑴의 λ³΅μž‘ν•œ Git Flowμ—μ„œ GitHub Flow둜 μ „ν™˜ν•˜μ—¬ 톡합 속도λ₯Ό 높이고 λ‹¨μˆœν™”ν•˜λ €λ©΄, 릴리슀 브랜치(release branch) 생성을 μ€‘λ‹¨ν•˜κ³ , `develop` 브랜치λ₯Ό `main`으둜 ν†΅ν•©ν•œ λ’€, `main` λΈŒλžœμΉ˜μ—μ„œ 직접 λ°°ν¬ν•˜λ„λ‘ CI/CD νŒŒμ΄ν”„λΌμΈμ„ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€ [2]. λ°˜λŒ€λ‘œ ν”„λ‘œμ νŠΈμ˜ ꡬ쑰가 더 λ³΅μž‘ν•΄μ§€λ©΄ `develop` 브랜치 등을 μΆ”κ°€ν•΄ Git Flow둜 λ˜λŒμ•„κ°ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ [12]. ## βš–οΈ Trade-offs & Caveats * **병합 μ½”λ“œμ˜ 즉각적인 리슀크**: `main` λΈŒλžœμΉ˜κ°€ μœ μΌν•œ 배포 기쀀점이 λ˜λ―€λ‘œ, λ¦¬λ·°λ‚˜ ν…ŒμŠ€νŠΈκ°€ λˆ„λ½λ˜μ–΄ 버그가 ν¬ν•¨λœ μ½”λ“œκ°€ 병합될 경우 ν”„λ‘œλ•μ…˜(운영) ν™˜κ²½μ— 치λͺ…적인 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€ [13, 14]. λ”°λΌμ„œ κ°•λ ₯ν•œ CI/CD μžλ™ν™” ν™˜κ²½κ³Ό Branch Protection Rule(보호 κ·œμΉ™)이 ν•„μˆ˜μ μœΌλ‘œ λ’·λ°›μΉ¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [1, 6]. * **브랜치 수λͺ… κ΄€λ¦¬μ˜ 어렀움**: κΈ°λŠ₯ λΈŒλžœμΉ˜κ°€ λ„ˆλ¬΄ 였래 μœ μ§€(Long-lived)되면 `main` λΈŒλžœμΉ˜μ™€μ˜ 차이가 λ²Œμ–΄μ Έ μ‹¬κ°ν•œ 병합 좩돌(Merge Conflict)이 λ°œμƒν•©λ‹ˆλ‹€ [13, 15]. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ κ°œλ°œμžλŠ” 맀일 μž‘μ—… μ „ `main` 브랜치의 μ΅œμ‹  μƒνƒœλ₯Ό λ‹Ήκ²¨μ˜€κ³ (pull/rebase) λ³€κ²½ 사항을 μž‘κ²Œ μœ μ§€ν•˜λŠ” κ·œμœ¨μ„ μ—„κ²©νžˆ μ§€μΌœμ•Ό ν•©λ‹ˆλ‹€ [11, 13]. * **λŒ€κ·œλͺ¨/μ •κΈ° 릴리슀 ν”„λ‘œμ νŠΈμ—μ„œμ˜ ν•œκ³„**: μ •ν•΄μ§„ 일정에 따라 버전을 λ¬Άμ–΄μ„œ 배포해야 ν•˜κ±°λ‚˜, μœ μ§€λ³΄μˆ˜ν•΄μ•Ό ν•  κ³Όκ±° 릴리슀 버전이 μ—¬λŸ¬ 개인 λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ˜ 경우, 릴리슀 λΈŒλžœμΉ˜κ°€ μ—†λŠ” GitHub FlowλŠ” ꡬ쑰적 ν•œκ³„λ₯Ό κ°€μ§‘λ‹ˆλ‹€. 이 κ²½μš°μ—λŠ” 무겁더라도 Git Flowκ°€ 더 적합할 수 μžˆμŠ΅λ‹ˆλ‹€ [12, 16]. ## πŸ”— Knowledge Connections ### Related Concepts #### [관계 μœ ν˜• A: μ•„ν‚€ν…μ²˜/기반 기술 (개발 μ›Œν¬ν”Œλ‘œμš°)] - [[Git Flow]] - μ—°κ²° 이유: GitHub Flow와 자주 λΉ„κ΅λ˜λŠ” λΆ„κΈ° μ „λž΅μœΌλ‘œ, ν”„λ‘œμ νŠΈμ˜ λ³΅μž‘μ„±μ— 따라 두 μ „λž΅ 사이λ₯Ό λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€ [2, 12]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: `develop`, `release`, `hotfix` 브랜치λ₯Ό μ‚¬μš©ν•˜λŠ” Git Flowλ₯Ό μ΄ν•΄ν•¨μœΌλ‘œμ¨, μƒλŒ€μ μœΌλ‘œ GitHub Flowκ°€ μƒλž΅ν•œ ꡬ쑰적 λ³΅μž‘μ„±κ³Ό 그에 λ”°λ₯Έ 속도/λ‹¨μˆœμ„±μ˜ 이점을 λͺ…ν™•νžˆ 비ꡐ할 수 μžˆμŠ΅λ‹ˆλ‹€. - [[Trunk-Based Development]] - μ—°κ²° 이유: μ†Œκ·œλͺ¨ νŒ€μ—μ„œ λΉ λ₯΄κ³  좩돌 μ—†λŠ” 병합을 μœ„ν•΄ λ„μž…ν•  수 μžˆλŠ” 또 λ‹€λ₯Έ κ²½λŸ‰ μ›Œν¬ν”Œλ‘œμš°μž…λ‹ˆλ‹€ [3, 16]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: κ·Ήλ‹¨μ μœΌλ‘œ 짧은 생λͺ…μ£ΌκΈ°μ˜ 브랜치λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 메인에 빈번히 직접 λ³‘ν•©ν•˜λŠ” 철학을 톡해 CI(지속적 톡합)의 λ³Έμ§ˆμ„ 더 깊게 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. #### [관계 μœ ν˜• B: κ΅¬ν˜„/ν™œμš© 도ꡬ] - [[Pull Request]] - μ—°κ²° 이유: GitHub Flowμ—μ„œ μ½”λ“œ 병합을 μˆ˜ν–‰ν•˜κ³  νŒ€μ› κ°„μ˜ ν˜‘μ—… 및 리뷰λ₯Ό μ§„ν–‰ν•˜λŠ” κ°€μž₯ 핡심적인 λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€ [8, 10]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ½”λ“œ ν’ˆμ§ˆ ν†΅μ œ, ν”Όμ–΄ 리뷰(Peer Review)의 μ—­ν•  및 CI/CD ν›…(Hook)이 μž‘λ™ν•˜λŠ” 방식을 ꡬ체적으둜 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. - [[CI/CD]] - μ—°κ²° 이유: `main` 브랜치λ₯Ό 항상 배포 κ°€λŠ₯ν•œ μƒνƒœλ‘œ μœ μ§€ν•˜κΈ° μœ„ν•΄ λ°°ν›„μ—μ„œ μ½”λ“œλ₯Ό κ²€μ¦ν•˜λŠ” ν•„μˆ˜ μžλ™ν™” νŒŒμ΄ν”„λΌμΈμž…λ‹ˆλ‹€ [1, 6]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ™œ μˆ˜λ™ 병합이 μœ„ν—˜ν•œμ§€, PR 리뷰가 λλ‚œ μ½”λ“œκ°€ μ–΄λ–»κ²Œ μ•ˆμ „ν•˜κ²Œ ν”„λ‘œλ•μ…˜ λ ˆλ²¨κΉŒμ§€ λ°°ν¬λ˜λŠ”μ§€μ˜ μ „ 과정을 νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ### Deeper Research Questions - Git Flow 기반 ν”„λ‘œμ νŠΈμ—μ„œ GitHub Flow둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•  λ•Œ, 기쑴의 버전 관리 체계 및 배포 μžλ™ν™” νŒŒμ΄ν”„λΌμΈμ„ μ–΄λ–»κ²Œ μž¬μ„€κ³„ν•΄μ•Ό ν•˜λŠ”κ°€? - GitHub Flow ν™˜κ²½μ—μ„œ κΈ°λŠ₯이 λ―Έμ™„μ„±λœ μƒνƒœλ‘œ `main`에 λ³‘ν•©λ˜μ–΄μ•Ό ν•  λ•Œ, Feature Flag(κΈ°λŠ₯ ν† κΈ€)λ₯Ό μ–΄λ–»κ²Œ 효과적으둜 ν™œμš©ν•  수 μžˆλŠ”κ°€? - νŒ€ 규λͺ¨κ°€ 3~5μΈμ—μ„œ 20인 μ΄μƒμœΌλ‘œ κΈ‰κ²©νžˆ μ„±μž₯ν•  λ•Œ, GitHub Flow의 ν•œκ³„μ μ€ ꡬ체적으둜 μ–΄λ–»κ²Œ λ‚˜νƒ€λ‚˜λ©° μ–΄λ–€ μ‹œμ μ— μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ „ν™˜ν•΄μ•Ό ν•˜λŠ”κ°€? - 컀밋 νžˆμŠ€ν† λ¦¬λ₯Ό μ •λ¦¬ν•˜κΈ° μœ„ν•΄ ꢌμž₯λ˜λŠ” Squash Merge 방식이 μž₯기적인 버그 좔적성(Traceability) κ΄€μ μ—μ„œλŠ” μ–΄λ–€ 단점을 κ°€μ§ˆ 수 μžˆλŠ”κ°€? - Branch Protection을 톡해 'μ΅œμ†Œ 1인의 리뷰'와 'CI 톡과'λ₯Ό κ°•μ œν•  λ•Œ, μ½”λ“œ 리뷰 병λͺ© ν˜„μƒμ„ ν•΄κ²°ν•˜κΈ° μœ„ν•œ ν”„λ‘œμ„ΈμŠ€μ  μ΅œμ ν™” 방법은 무엇인가? ### Practical Application Contexts - **Implementation:** κ°œλ°œμžλŠ” JIRA λ“±μ—μ„œ 할당받은 ν‹°μΌ“ IDλ₯Ό 기반으둜 `feature/PROJ-123-login` ν˜•μ‹μ˜ 브랜치λ₯Ό λ”°κ³ , ν•œ κ°€μ§€ 논리적 λ³€κ²½μ‚¬ν•­λ§Œ 담은 Atomic Commit을 μˆ˜ν–‰ν•œ λ’€ PR을 μƒμ„±ν•©λ‹ˆλ‹€. - **System Design:** GitHub/GitLab λ“±μ˜ λ ˆν¬μ§€ν† λ¦¬ μ„€μ •μ—μ„œ `main` λΈŒλžœμΉ˜μ— λŒ€ν•΄ 직접 ν‘Έμ‹œ(Direct Push)λ₯Ό μ°¨λ‹¨ν•˜κ³ , Status Check(ν…ŒμŠ€νŠΈ 톡과) 및 μ§€μ •λœ λ¦¬λ·°μ–΄μ˜ Approveλ₯Ό κ°•μ œν•˜λŠ” 보호 κ·œμΉ™(Branch Protection)을 μ„€κ³„ν•©λ‹ˆλ‹€. - **Operation / Maintenance:** CI/CD νŒŒμ΄ν”„λΌμΈμ΄ `main` 브랜치의 변경을 κ°μ§€ν•˜λ©΄ μžλ™μœΌλ‘œ ν”„λ‘œλ•μ…˜μ— λ°°ν¬λ˜λ„λ‘ κ΅¬μ„±ν•˜κ³ , μ €μž₯μ†Œμ˜ κΉ”λ”ν•œ 관리λ₯Ό μœ„ν•΄ λ³‘ν•©λœ λΈŒλžœμΉ˜λŠ” μ‹œμŠ€ν…œμ—μ„œ μžλ™ μ‚­μ œλ˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€. - **Learning Path:** Git 브랜치 기초 λͺ…λ Ήμ–΄ μˆ™μ§€ -> 1κΈ°λŠ₯ 1브랜치 원칙 μ‹€μŠ΅ -> PR μž‘μ„± 및 λ™λ£Œ 리뷰 κ²½ν—˜ -> μžλ™ν™”λœ CI/CDμ™€μ˜ 연동 μ΄ν•΄μ˜ μˆœμ„œλ‘œ ν˜‘μ—… λŠ₯λ ₯을 μ„±μž₯μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. - **My Project Relevance:** 3~5λͺ…μ˜ μ†Œκ·œλͺ¨ νŒ€μ—μ„œ μΆ©λŒμ„ μ΅œμ†Œν™”ν•˜λ©΄μ„œλ„ λΉ λ₯Έ ν”Όλ“œλ°±κ³Ό λ¦΄λ¦¬μŠ€κ°€ ν•„μš”ν•œ ν˜„μž¬ ν”„λ‘œμ νŠΈ 상황에, λΆˆν•„μš”ν•œ 절차λ₯Ό μ—†μ• κ³  μ•ˆμ •μ„±μ„ 보μž₯ν•˜λŠ” κ°€μž₯ 이상적인 ν˜‘μ—… λͺ¨λΈλ‘œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ### Adjacent Topics - [[Conventional Commits]] - ν™•μž₯ λ°©ν–₯: 컀밋 λ©”μ‹œμ§€λ₯Ό `feat:`, `fix:`, `chore:` λ“±μ˜ 규격으둜 ν†΅μΌν•¨μœΌλ‘œμ¨, PR λ‚΄μš©μ˜ 가독성을 높이고 ν–₯ν›„ 릴리슀 λ…ΈνŠΈλ₯Ό μžλ™ν™”ν•˜λŠ” λ°©ν–₯으둜 지식을 ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. - [[Issue Tracking System]] - ν™•μž₯ λ°©ν–₯: μ½”λ“œ κ΅¬ν˜„(GitHub)κ³Ό μš”κ΅¬μ‚¬ν•­ μ •μ˜(JIRA, Linear λ“±)λ₯Ό μ—°κ²°ν•˜μ—¬ ν”„λ‘œμ νŠΈ 관리 μˆ˜μ€€μ„ 높이고 λ³€κ²½ μ‚¬ν•­μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ§₯락(Traceability)을 μΆ”μ ν•˜λŠ” λ°©λ²•λ‘ μœΌλ‘œ ν™•μž₯λ©λ‹ˆλ‹€. --- *Last updated: 2026-04-30*