ブランチ戦略入門:GitHub Flow・git-flow・trunk-based development
チームでGitを活用する際の代表的なブランチ戦略を比較し、実際の運用フローを演習形式で学びます。
このチュートリアルでは、チームでGitを使う際に重要な「ブランチ戦略」を学びます。どのブランチ戦略を選ぶかによって、リリースフロー・コードレビューの運用・CI/CDとの連携が大きく変わります。
ブランチ戦略の比較
| 戦略 | 主なブランチ | チーム規模 | リリース頻度 | CI/CDとの相性 |
|---|---|---|---|---|
| GitHub Flow | main・feature | 小〜中 | 随時(継続的) | 非常に高い |
| git-flow | main・develop・feature・release・hotfix | 中〜大 | 定期リリース | 中程度 |
| trunk-based development | main(trunk) | 中〜大 | 随時(継続的) | 非常に高い |
演習 1:GitHub Flow を実践する
GitHub Flow は最もシンプルなブランチ戦略です。main ブランチを常にデプロイ可能な状態に保ち、すべての開発を短命な feature ブランチで行います。
問題: 以下の手順を実際のコマンドで書いてください。
mainからfeature/add-loginブランチを作成する- ファイルを変更してコミットする
- リモートにプッシュしてプルリクエストを作成する準備をする
答えを見る
# 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-loginGitHub 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/xxx | develop から派生する機能開発ブランチ |
release/1.2.0 | リリース準備専用(バグ修正・バージョン番号更新のみ) |
hotfix/xxx | main から派生する緊急修正ブランチ |
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 maintrunk-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)を使ってください。
- ユーザー登録機能の追加
- ログインページの文字化けバグ修正
- ライブラリのバージョンアップデート
- v2.0.0 のリリース準備
- 本番環境の決済バグ緊急修正
答えを見る
| 作業 | ブランチ名の例 |
|---|---|
| ユーザー登録機能の追加 | 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環境に合わせて選択し、必要であれば組み合わせて使いましょう。