コンテンツにスキップ

第4章 ブランチ戦略

ブランチの作り方やマージのやり方を学んだところで、
この章では一歩引いて 「チームとしてブランチをどう運用するか」 を考えましょう。

ブランチ戦略は、チームの規模・リリースサイクル・プロダクトの特性によって最適解が変わります。
管理者として 「なぜこの戦略なのか」を説明できる ことが重要です 🗺️


Git Flow は、2010年に Vincent Driessen が提唱した戦略で、
リリースサイクルが明確な プロジェクトに適しています。

%%{init: { 'gitGraph': { 'showCommitLabel': true, 'mainBranchName': 'main' } } }%%
gitGraph
    commit id: "v1.0.0" tag: "v1.0.0"
    branch develop
    checkout develop
    commit id: "dev-1"
    branch feature/login
    checkout feature/login
    commit id: "feat-1"
    commit id: "feat-2"
    checkout develop
    merge feature/login id: "merge-feat"
    branch release/1.1
    checkout release/1.1
    commit id: "rc-fix"
    checkout main
    merge release/1.1 id: "v1.1.0" tag: "v1.1.0"
    checkout develop
    merge release/1.1 id: "merge-rc"
    checkout main
    branch hotfix/security
    commit id: "hf-1"
    checkout main
    merge hotfix/security id: "v1.1.1" tag: "v1.1.1"
    checkout develop
    merge hotfix/security id: "merge-hf"
ブランチ寿命役割
main永続本番環境のコード。
常にリリース可能
develop永続開発の統合ブランチ。
次のリリースの準備
feature/*一時的新機能の開発。
develop から分岐し develop にマージ
release/*一時的リリース準備。
develop から分岐し main と develop にマージ
hotfix/*一時的緊急修正。
main から分岐し main と develop にマージ
flowchart TD
    A["① feature ブランチで開発"] --> B["② develop にマージ"]
    B --> C["③ release ブランチを作成"]
    C --> D["④ テスト・バグ修正"]
    D --> E["⑤ main にマージ + タグ付け"]
    E --> F["⑥ develop にもマージ"]

    G["🚨 本番バグ発見"] --> H["hotfix ブランチを作成"]
    H --> I["main と develop にマージ"]

    style A fill:#E8F5E9,stroke:#43A047,color:#1B5E20
    style E fill:#F3E5F5,stroke:#8E24AA,color:#4A148C
    style G fill:#FFEBEE,stroke:#E53935,color:#B71C1C
✅ メリット❌ デメリット
リリースの管理が厳密にできるブランチが多く運用が複雑
本番とリリース準備を分離できるマージが頻繁に発生する
バージョン管理がしやすいリリースサイクルが遅くなりがち
ホットフィックスの手順が明確小規模チームにはオーバースペック

GitHub Flow は、GitHub 社が提唱した シンプルな 戦略です。
継続的デリバリー を実践するチームに広く採用されています。

%%{init: { 'gitGraph': { 'showCommitLabel': true, 'mainBranchName': 'main' } } }%%
gitGraph
    commit id: "init"
    branch feature/login
    checkout feature/login
    commit id: "feat-1"
    commit id: "feat-2"
    checkout main
    merge feature/login id: "PR #1"
    branch fix/header
    checkout fix/header
    commit id: "fix-1"
    checkout main
    merge fix/header id: "PR #2"
    branch feature/profile
    checkout feature/profile
    commit id: "feat-3"
    commit id: "feat-4"
    checkout main
    merge feature/profile id: "PR #3"

たった6つのルール で運用できます。

flowchart TD
    R1["① main は常にデプロイ可能"]
    R2["② 作業は main から
ブランチを切る"] R3["③ ブランチ名は
わかりやすく"] R4["④ こまめに push する"] R5["⑤ Pull Request で
レビューを受ける"] R6["⑥ レビュー後に
main にマージ → デプロイ"] R1 --> R2 --> R3 --> R4 --> R5 --> R6 style R1 fill:#E8F5E9,stroke:#43A047,color:#1B5E20 style R5 fill:#E3F2FD,stroke:#1E88E5,color:#0D47A1 style R6 fill:#F3E5F5,stroke:#8E24AA,color:#4A148C
✅ メリット❌ デメリット
シンプルで覚えやすいリリースの細かい管理が難しい
CI/CD と相性が良い複数バージョン管理には向かない
デプロイ頻度が高くなるmain の品質管理が重要
ブランチの迷いが少ない大規模チームでは競合が増えやすい

Trunk-Based Development (TBD) は、
全員がメインブランチ(trunk)に直接コミットする、または
非常に短命なブランチ で開発する戦略です。

%%{init: { 'gitGraph': { 'showCommitLabel': true, 'mainBranchName': 'trunk' } } }%%
gitGraph
    commit id: "A"
    commit id: "B"
    branch short-lived/feat-1
    checkout short-lived/feat-1
    commit id: "feat"
    checkout trunk
    merge short-lived/feat-1 id: "merge"
    commit id: "C"
    commit id: "D"
    branch short-lived/fix-1
    checkout short-lived/fix-1
    commit id: "fix"
    checkout trunk
    merge short-lived/fix-1 id: "merge2"
    commit id: "E"
ルール説明
ブランチは 1〜2日以内 にマージ長命ブランチを作らない
フィーチャーフラグ で未完成機能を隠すコードは main にあるが、ユーザーには見えない
CI が必須trunk が常に壊れていないことを保証
全員が毎日 trunk に統合「大きなマージ」を避ける

未完成の機能をコードとしては main にマージしつつ、
フラグで表示/非表示を切り替える テクニックです。

// フィーチャーフラグの例
if (featureFlags.newLoginPage) {
renderNewLoginPage();
} else {
renderOldLoginPage();
}
✅ メリット❌ デメリット
マージの競合が最小限フィーチャーフラグの管理が必要
常に最新のコードで開発CI/CD の整備が前提
デプロイが非常に高速高い規律とスキルが求められる
Google / Facebook 等の大手が採用小さな変更の積み重ねが必要

4.2 プロジェクト規模に応じた戦略の選定

Section titled “4.2 プロジェクト規模に応じた戦略の選定”
項目Git FlowGitHub FlowTrunk-Based
複雑さ高い低い中〜高
ブランチ数多い少ない最小限
リリース管理◎ 厳密△ シンプル○ フラグで管理
デプロイ頻度低〜中高い非常に高い
CI/CD 依存度非常に高い
チーム規模中〜大小〜中小〜大
学習コスト高い低い
flowchart TD
    START["🤔 どのブランチ戦略?"]
    Q1{"リリース日が
決まっている?"} Q2{"CI/CD パイプラインは
整備されている?"} Q3{"フィーチャーフラグを
導入できる?"} Q4{"チーム規模は?"} START --> Q1 Q1 -- "はい" --> GF["📋 Git Flow
リリース管理を厳密に"] Q1 -- "いいえ" --> Q2 Q2 -- "いいえ" --> GH1["🔄 GitHub Flow
まずはシンプルに"] Q2 -- "はい" --> Q3 Q3 -- "いいえ" --> GH2["🔄 GitHub Flow
十分高速に開発できる"] Q3 -- "はい" --> Q4 Q4 -- "小〜中規模" --> GH3["🔄 GitHub Flow
or Trunk-Based"] Q4 -- "大規模" --> TB["🚀 Trunk-Based
スケーラブルに"] style GF fill:#F3E5F5,stroke:#8E24AA,color:#4A148C style GH1 fill:#E3F2FD,stroke:#1E88E5,color:#0D47A1 style GH2 fill:#E3F2FD,stroke:#1E88E5,color:#0D47A1 style GH3 fill:#E3F2FD,stroke:#1E88E5,color:#0D47A1 style TB fill:#E8F5E9,stroke:#43A047,color:#1B5E20

ブランチ戦略を決定したら、以下を整備しましょう。

flowchart LR
    A["① 戦略の文書化
README or Wiki"] B["② Branch Protection
Rules の設定"] C["③ CI/CD の構築"] D["④ チームへの説明"] E["⑤ 定期的な見直し"] A --> B --> C --> D --> E E -. "改善" .-> A style A fill:#E3F2FD,stroke:#1E88E5,color:#0D47A1 style B fill:#FFF3E0,stroke:#FB8C00,color:#E65100 style C fill:#E8F5E9,stroke:#43A047,color:#1B5E20 style D fill:#F3E5F5,stroke:#8E24AA,color:#4A148C style E fill:#FFF9C4,stroke:#F9A825,color:#F57F17
やること内容
文書化どのブランチから分岐するか、マージ先はどこか、命名規則は何か
Branch Protectionmain / develop への直接 push を禁止、レビュー必須など(第6章で詳しく解説)
CI/CDPR 作成時にテスト・リント自動実行(第7章で詳しく解説)
チーム説明オンボーディング資料として整備、ハンズオンの実施
定期見直しチームの成長やプロダクトの変化に合わせて調整

戦略一言で言うと向いている場面
Git Flow「きっちり管理」リリース計画が明確なプロジェクト
GitHub Flow「シンプル&高速」Web アプリ、小〜中規模チーム
Trunk-Based「最速デリバリー」CI/CD が成熟したチーム