はじめに:コミットするだけで満足していませんか?
Gitの使い方を調べると、まず「コミット」「プッシュ」「プル」といった基本操作が出てきます。それらを覚えた後、多くの人が次のステップとして「ブランチ」を学びますが、実際のチーム開発でどう運用するかまで体系的に理解できている人は意外と少ないものです。
「とりあえず feature ブランチを切って、終わったら main にマージしている」という状態で日々の開発をこなしている方も多いのではないでしょうか。それ自体は間違いではありませんが、チームの規模が大きくなったり、リリースサイクルが複雑になってきたりすると、その場しのぎのブランチ運用では次第に立ちゆかなくなります。コンフリクトが頻発したり、どのブランチが本番環境に対応しているのか分からなくなったり、緊急のバグ修正をどこに入れればいいか迷ったりといった場面に遭遇したことはないでしょうか。
この記事では、実務で広く使われているブランチ戦略のモデルを3種類紹介し、それぞれの特徴と向いているチーム・プロジェクトの規模を整理します。「なんとなく」使っているGitを、チーム全体の武器に変えるためのヒントをお伝えします。
ブランチ戦略とは何か
ブランチ戦略とは、開発チームがGitブランチをどのように命名し、どのような役割を持たせ、どのようにマージするかを定めたルールセットのことです。チームメンバー全員が同じルールに従って作業することで、「誰がどこで何をしているか」が明確になり、コードの流れが制御しやすくなります。
戦略がないチームでは次のような問題が起きがちです。
- 開発者それぞれが好き勝手なブランチ名を付けるため、何のための作業ブランチか分からなくなる
- 複数の作業が main ブランチに混在し、特定の機能だけをリリースに含めたい場合に対処できない
- 本番環境のバグ修正と新機能開発が同じブランチで進み、意図しないコードが本番に出てしまう
逆にいえば、適切なブランチ戦略を導入するだけで、これらの問題の大半は解決できます。
代表的な3つのブランチモデル
Git Flow:長期リリースサイクルに向いた王道モデル
Git Flowは2010年にVincent Driessenが提唱したブランチモデルで、長らく業界標準のように扱われてきました。ブランチの種類と役割が明確に定義されているのが特徴です。
| ブランチ名 | 役割 | 直接コミット |
|---|---|---|
| main | 本番リリース済みコードのみ | 不可 |
| develop | 次期リリースの統合ブランチ | 不可 |
| feature/* | 機能開発用の作業ブランチ | 可 |
| release/* | リリース準備・最終調整用 | バグ修正のみ |
| hotfix/* | 本番バグの緊急修正用 | 可 |
開発の流れを説明すると、新機能は feature/xxx ブランチを切って開発し、完成したら develop にマージします。リリースのタイミングが来たら develop から release/1.0.0 を作成し、テストや細かい修正を行ったのちに main と develop 両方にマージします。本番で急なバグが見つかった場合は main から hotfix/xxx を切って修正し、main と develop の両方に反映させます。
Git Flowが威力を発揮するのは、バージョン番号を持つソフトウェアのリリースサイクルが明確なプロジェクトです。スマホアプリやパッケージソフトウェアなど、「v1.2.3」という形でバージョン管理をしている場合に特に向いています。
一方で、Webサービスのように毎日デプロイするような開発スタイルには少々重すぎる面があります。ブランチの種類が多く、マージの手順も複雑なため、小規模チームや高速なリリースサイクルには合わないこともあります。
GitHub Flow:シンプルさを追求した継続的デリバリー向けモデル
GitHub Flowは、GitHubが提唱したよりシンプルなブランチ戦略です。ブランチは基本的に2種類しか存在しません。
まず main ブランチは常にデプロイ可能な状態を保ちます。これがこのモデルの根幹にある考え方です。開発者は作業を始める際に main から作業ブランチを切り、作業が完了したらプルリクエストを作成してレビューを受け、承認されたら main にマージして即座にデプロイします。
main ──────────────────────────────────────────►
│ ▲
└─── feature/new-login ────┘
(PR → レビュー → マージ → デプロイ)
このモデルの最大の魅力はシンプルさです。覚えるルールが少なく、新しくチームに加わったメンバーでもすぐに理解できます。継続的デリバリー(CD)との相性が良く、マージのたびに自動デプロイが走るような仕組みと組み合わせると真価を発揮します。
ただし、「main は常にデプロイ可能」という前提を守るために、プルリクエストのレビューを丁寧に行い、CIでの自動テストを必ず通過させる規律が求められます。その前提が崩れると、壊れたコードが main に混入してしまいます。
GitLab Flow:環境ごとのブランチで本番管理を明確に
GitLab Flowは GitHub Flowをベースにしながら、環境ごとのブランチを追加したモデルです。main の他に staging や production といった環境対応ブランチを持ち、コードの昇格フローを明確にします。
feature/* → main → staging → production
ステージング環境でのQAが完了したら production にマージしてデプロイ、という流れを取ることで、「staging に入っているが本番には出ていないコード」の範囲が明確になります。複数の環境を持つ中規模以上のWebサービスに向いています。
どのモデルを選ぶべきか
3つのモデルを比較してみましょう。
| モデル | チーム規模 | リリース頻度 | 複雑さ |
|---|---|---|---|
| Git Flow | 中〜大規模 | 低〜中(バージョン管理あり) | 高め |
| GitHub Flow | 小〜中規模 | 高(毎日〜毎週) | 低め |
| GitLab Flow | 中規模 | 中(環境が複数ある場合) | 中程度 |
重要なのは「有名だから」「大企業が使っているから」という理由でモデルを選ばないことです。チームの人数、リリースの頻度、プロダクトの性質によって最適解は変わります。小さなチームで高速に開発するなら GitHub Flow が、バージョン付きのソフトウェアを管理しながら開発するなら Git Flow が向いています。
実務で守るべきブランチ運用のルール
モデルを決めたとしても、チームで守るべき共通ルールがなければ意味を成しません。筆者がさまざまなプロジェクトを経験して感じた、実務で特に重要な5つのルールを紹介します。
ブランチ名の命名規則を統一する
feature/user-authentication や fix/login-null-pointer のように、種別/内容 の形式で命名することをチーム全体で統一します。命名規則があると、一覧表示したときにブランチの目的が一目で分かります。よく使われる種別プレフィックスは feature(機能追加)、fix(バグ修正)、docs(ドキュメント)、refactor(リファクタリング)、chore(雑務・依存関係の更新など)あたりです。
作業ブランチの寿命を短く保つ
ブランチを長期間放置すると、その間に他のメンバーが行った変更と乖離が大きくなり、マージ時のコンフリクトが増えます。理想的には1〜3日以内に作業を完了させてマージするのが望ましいです。大きな機能を開発する場合も、小さな単位に分割してこまめにマージする「フィーチャーフラグ」という手法と組み合わせると良いでしょう。
main / develop には直接コミットしない
保護ブランチ(Protected Branch)の設定を使って、main や develop への直接プッシュを禁止することを強くお勧めします。必ずプルリクエストを経由させることで、意図しない変更の混入を防ぎ、コードレビューの機会を確保できます。GitHubもGitLabも、この設定はリポジトリの管理画面から数クリックで行えます。
マージ前に必ず最新を取り込む
自分のブランチを main にマージする前に、最新の main を自分のブランチに取り込む(git rebase main または git merge main)習慣をつけましょう。これによりコンフリクトをマージ前に解消でき、レビュアーに渡す前にローカルで動作確認もできます。
コミットメッセージを意味のある内容にする
「修正」「fix」「tmp」といったコミットメッセージは、後から履歴を追うときにまったく役に立ちません。「ログイン時のメールアドレスのnullチェックを追加」のように、何を・なぜ変更したかが分かるメッセージを書く習慣を身につけましょう。Conventional Commits(feat:, fix:, docs: などのプレフィックスを使う規約)を採用すると、CHANGELOG の自動生成なども可能になります。
まとめ
ブランチ戦略は、チーム開発の「交通ルール」のようなものです。ルールがなければそれぞれが好き勝手に走り、事故が起きます。ルールが複雑すぎればメンバーが覚えられず形骸化します。自分たちのチームとプロジェクトに合った戦略を選び、シンプルなルールから始めて運用しながら改善していく姿勢が大切です。
まずはブランチ命名規則を統一するところから始めてみてください。たったそれだけでも、チームの見通しは大きく改善されます。Gitはコマンドを覚えるツールではなく、チームで協力するための共通言語です。その言語を正しく使いこなすことが、エンジニアとしての成長につながります。