13 上級 約 40 分

ブランチ戦略入門:GitHub Flow・git-flow・trunk-based development

チームでGitを活用する際の代表的なブランチ戦略を比較し、実際の運用フローを演習形式で学びます。

このチュートリアルでは、チームでGitを使う際に重要な「ブランチ戦略」を学びます。どのブランチ戦略を選ぶかによって、リリースフロー・コードレビューの運用・CI/CDとの連携が大きく変わります。

ブランチ戦略の比較

戦略主なブランチチーム規模リリース頻度CI/CDとの相性
GitHub Flowmain・feature小〜中随時(継続的)非常に高い
git-flowmain・develop・feature・release・hotfix中〜大定期リリース中程度
trunk-based developmentmain(trunk)中〜大随時(継続的)非常に高い

演習 1:GitHub Flow を実践する

GitHub Flow は最もシンプルなブランチ戦略です。main ブランチを常にデプロイ可能な状態に保ち、すべての開発を短命な feature ブランチで行います。

問題: 以下の手順を実際のコマンドで書いてください。

  1. main から feature/add-login ブランチを作成する
  2. ファイルを変更してコミットする
  3. リモートにプッシュしてプルリクエストを作成する準備をする
答えを見る
# 1. main から feature ブランチを作成
git checkout main
git pull origin main
git checkout -b feature/add-login

# 2. 変更してコミット
echo "# Login page" > login.md
git add login.md
git commit -m "feat: ログインページを追加"

# 3. リモートへプッシュ(プルリクエストはGitHub UI で作成)
git push -u origin feature/add-login

GitHub Flow のポイント:

  • main は常にデプロイ可能な状態を維持する
  • ブランチ名は作業内容が分かるように命名する(例: feature/add-login, fix/typo-in-readme)
  • プッシュしたらすぐにプルリクエストを作成してレビューを依頼する
  • レビュー通過後、main にマージしてすぐにデプロイする

演習 2:git-flow のブランチ構成を理解する

git-flow は、定期リリースサイクルを持つプロジェクト向けのブランチ戦略です。複数の専用ブランチが役割を分担します。

問題: 以下の git-flow のブランチそれぞれの役割を答えてください。また、v1.2.0 のリリース準備を開始するコマンドを書いてください。

ブランチ役割
main?
develop?
feature/xxx?
release/1.2.0?
hotfix/xxx?
答えを見る
ブランチ役割
mainリリース済みの本番コードを管理。タグが打たれる
develop次のリリースに向けた開発の統合先
feature/xxxdevelop から派生する機能開発ブランチ
release/1.2.0リリース準備専用(バグ修正・バージョン番号更新のみ)
hotfix/xxxmain から派生する緊急修正ブランチ

v1.2.0 のリリース準備:

# develop から release ブランチを作成
git checkout develop
git pull origin develop
git checkout -b release/1.2.0

# バージョン番号を更新してコミット
# (package.json や VERSION ファイルなどを編集)
git add .
git commit -m "chore: バージョンを1.2.0に更新"

# テスト・バグ修正後、main と develop 両方にマージ
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release v1.2.0"

git checkout develop
git merge --no-ff release/1.2.0

# release ブランチを削除
git branch -d release/1.2.0

--no-ff オプションを使うことで、マージコミットを明示的に作成し、ブランチの存在を履歴に残します。


演習 3:trunk-based development の考え方を理解する

trunk-based development は、すべての開発者が1つの main(trunk)ブランチに頻繁に小さな変更をマージし続ける戦略です。長命なブランチを避け、フィーチャーフラグを使って未完成の機能を隠します。

問題: 「まだUIができていない新機能」を trunk-based development で安全に main にマージするにはどうすればよいですか?コード例を含めて説明してください。

答えを見る

フィーチャーフラグ(Feature Flag)を使う方法が一般的です。

# Python の例
import os

FEATURE_NEW_DASHBOARD = os.environ.get("FEATURE_NEW_DASHBOARD", "false") == "true"

if FEATURE_NEW_DASHBOARD:
    # 新しいダッシュボードを表示(開発中)
    render_new_dashboard()
else:
    # 既存のダッシュボードを表示
    render_old_dashboard()
# 本番環境ではフラグをオフにしたまま main にマージ可能
git checkout -b feat/new-dashboard
# ... 実装 ...
git checkout main
git merge feat/new-dashboard  # フラグがオフなので本番に影響なし
git push origin main

trunk-based development のポイント:

  • ブランチは最大1〜2日で main にマージする
  • 未完成の機能はフィーチャーフラグで隠す
  • CI が常にグリーンな状態を保つ
  • 小さなコミットを頻繁にマージすることでコンフリクトを最小化する

演習 4:長期運用ブランチの同期戦略

feature ブランチの開発中に main が更新されると、マージ時にコンフリクトが発生しやすくなります。定期的に同期することでリスクを減らします。

問題: feature/big-refactor ブランチで作業中に main が大きく更新されました。main の最新変更を feature/big-refactor に取り込む2つの方法(merge と rebase)を書き、それぞれのメリットを説明してください。

答えを見る

方法1: merge(履歴を保持する)

git checkout feature/big-refactor
git fetch origin
git merge origin/main

# マージコミットが作られる
# 例: Merge branch 'main' into feature/big-refactor

メリット:

  • main のどのコミットで同期したかが履歴に残る
  • チームで共有しているブランチに安全(force push 不要)

方法2: rebase(履歴をきれいに保つ)

git checkout feature/big-refactor
git fetch origin
git rebase origin/main

# feature ブランチのコミットが main の先頭に積み直される
# ※ 共有ブランチの場合は force push が必要になるため注意

メリット:

  • コミット履歴が直線的でわかりやすくなる
  • git log --oneline がすっきりする

どちらを選ぶか:

  • 個人の feature ブランチ → rebase 推奨(きれいな履歴)
  • チームで共有しているブランチ → merge 推奨(安全性優先)

演習 5:ブランチ命名規則を設計する

チーム内でブランチ名のルールを統一することで、CIフィルターやコードレビューの管理が楽になります。

問題: 以下の作業に適切なブランチ名を考えてください。命名規則として <種類>/<説明> 形式(例: feature/add-login)を使ってください。

  1. ユーザー登録機能の追加
  2. ログインページの文字化けバグ修正
  3. ライブラリのバージョンアップデート
  4. v2.0.0 のリリース準備
  5. 本番環境の決済バグ緊急修正
答えを見る
作業ブランチ名の例
ユーザー登録機能の追加feature/user-registration
ログインページの文字化けバグ修正fix/login-garbled-text
ライブラリのバージョンアップデートchore/update-dependencies
v2.0.0 のリリース準備release/2.0.0
本番環境の決済バグ緊急修正hotfix/payment-critical-bug

よく使われるプレフィックス:

  • feature/ または feat/: 新機能
  • fix/ または bugfix/: バグ修正
  • hotfix/: 本番の緊急修正
  • chore/: ビルド・依存関係・設定の変更
  • docs/: ドキュメントのみの変更
  • refactor/: リファクタリング
  • release/: リリース準備
  • test/: テストの追加・修正

チームで .github/BRANCH_NAMING.md などにルールを文書化しておくと、全員が迷わず一貫したブランチ名をつけられます。


まとめ:自分のチームに合った戦略を選ぶ

GitHub Flow:
  ✅ 小〜中規模チーム
  ✅ 継続的デプロイ(毎日リリース)
  ✅ CI/CD が充実している
  ❌ 複数バージョンの同時サポートが必要な場合は不向き

git-flow:
  ✅ 定期リリース(週次・月次)
  ✅ 複数バージョンの並行サポート
  ❌ ブランチが増えすぎて管理が複雑になりやすい

trunk-based development:
  ✅ 大規模チーム
  ✅ 高頻度デプロイ(1日複数回)
  ✅ フィーチャーフラグの仕組みが整っている
  ❌ フィーチャーフラグの管理コストが発生する

どの戦略も「チームが継続的に高品質なコードを出し続けられるか」を目的としています。チームの規模・リリースサイクル・CI/CD環境に合わせて選択し、必要であれば組み合わせて使いましょう。