ひとことで言うと#
main、develop、feature、release、hotfixの5種類のブランチを使い分けて、機能開発からリリースまでの流れを体系的に管理するGitのブランチ戦略。リリースサイクルが明確なプロジェクトで特に効果的。
押さえておきたい用語#
- developブランチ
- 次のリリースに向けた開発統合ブランチのこと。すべてのfeatureブランチはここから分岐し、ここにマージされる。
- featureブランチ
- 1つの機能を開発するためにdevelopから分岐する短命のブランチのこと。完了後はdevelopにマージして削除する。
- releaseブランチ
- リリース前のバグ修正やバージョン番号更新を行うリリース準備用ブランチのこと。developから分岐し、完了後はmainとdevelopの両方にマージする。
- hotfixブランチ
- 本番環境の緊急バグを修正するためにmainから直接分岐するブランチのこと。修正後はmainとdevelopの両方にマージし、バージョンタグを付与する。
Gitフローの全体像#
こんな悩みに効く#
- ブランチの運用ルールがなく、マージの混乱が頻発する
- リリース準備中に新機能の開発と混ざってしまう
- 本番で緊急バグが見つかったとき、修正の手順が定まっていない
基本の使い方#
長期的に存在する2つのブランチを設定する。
- main: 本番リリースされたコードのみが入る。常にデプロイ可能
- develop: 次のリリースに向けた開発の統合ブランチ
- mainには直接コミットしない
ポイント: mainのすべてのコミットにはバージョンタグを付ける。
新機能はdevelopから分岐したfeatureブランチで開発する。
- 命名規則:
feature/ユーザー認証feature/検索機能など - developから分岐し、完了したらdevelopにマージ
- 1機能1ブランチ。完了後はブランチを削除
ポイント: featureブランチが長期化するとマージが困難になる。できるだけ短く保つ。
リリース前のバグ修正やバージョン番号更新はreleaseブランチで行う。
- developから分岐:
release/v1.2.0 - バグ修正のみ行い、新機能は入れない
- 完了したらmainとdevelopの両方にマージ
ポイント: releaseブランチが存在する間も、developでは次のリリースの開発を続けられる。
本番の緊急バグはmainから直接hotfixブランチを切って対応する。
- mainから分岐:
hotfix/ログインバグ修正 - 修正完了後、mainとdevelopの両方にマージ
- mainにバージョンタグを付ける
ポイント: hotfixは「本番が壊れている」緊急時のみ使う。通常のバグ修正はfeatureブランチで。
具体例#
Before: ブランチ運用ルールがなく、全員がmainに直接プッシュ。月1回のリリース前に「どのコミットまでがリリース対象か」が分からず、リリース延期が年4回発生。未完成の機能がストアに出てしまい、1つ星レビューが急増。
Gitflow導入: developを統合ブランチとし、featureブランチでの開発を必須化。リリース2週間前にreleaseブランチを作成し、バグ修正のみ許可。
After: リリース対象が明確になり、リリース延期が年4回→0回に。未完成機能の混入事故もゼロ。releaseブランチで安定化に専念できるため、リリース後の緊急パッチが月2回→月0.3回に激減。
状況: v2.0のrelease準備中(releaseブランチ存在)に、本番v1.9で決済処理のクラッシュバグが発覚。同時にv2.1向けのfeatureも3本開発中。
hotfixフロー: mainからhotfix/payment-crashを作成→原因特定→修正→テスト→mainにマージしてv1.9.1をリリース→developにもマージ。所要時間30分。
効果: releaseブランチの作業は中断不要。3本のfeature開発にも影響なし。以前はhotfixの手順がなく、mainへの直接コミットでさらなるバグを生んでいた(年3回の二次障害)。Gitflow導入後は二次障害ゼロ。
Before: developから直接mainにマージしてリリースしていたため、QAチームのテスト期間が確保できず、リリース後のバグ報告が月平均12件。
release運用導入: リリース1週間前にdevelopからreleaseブランチを作成。QAチームがreleaseブランチでテスト→バグ修正→再テストのサイクルを回す。その間developでは次の開発を継続。
After: リリース前に平均8件のバグを事前に検出・修正。リリース後のバグ報告が月12件→月2件に減少。品質ゲートの通過率が60%→95%に向上。QAチームの残業時間も月30時間→月8時間に削減。
やりがちな失敗パターン#
- featureブランチが長期化する — 2週間以上developとマージしないと、マージコンフリクトが地獄になる。最低でも1日1回developを取り込む(rebaseまたはmerge)
- releaseブランチで新機能を入れてしまう — 「ついでにこの機能も」とreleaseに混ぜるとリリースが遅延する。releaseではバグ修正のみ。新機能はdevelopで
- hotfixをdevelopにマージし忘れる — mainだけに反映し、developに入れ忘れて次のリリースで同じバグが復活する。hotfixは必ずmainとdevelopの両方にマージする
- 日次デプロイのWebアプリにGitflowを適用する — リリースサイクルが短いプロジェクトではreleaseブランチが形骸化し、無駄なオーバーヘッドになる。日次デプロイならトランクベース開発を検討する
まとめ#
Gitflowはリリースサイクルが明確なプロジェクト(モバイルアプリ、パッケージソフト等)に適したブランチ戦略。5種類のブランチの使い分けを覚えれば、並行開発とリリース管理がスムーズになる。ただし、継続的デリバリーを重視するWebアプリではトランクベース開発の方が向いている場合もある。プロジェクトの特性に合わせて選ぼう。