「develop 廃止」が腑に落ちなかったので、Git Flow の概念から整理し直したメモ。
Git Flow とは
2010 年に Vincent Driessen が提唱したブランチ運用の型。「本番に出す単位はバージョン(束)」という前提で、5 種類のブランチに役割を固定する。
| ブランチ | 役割 | 寿命 |
|---|---|---|
| main(当時は master) | 本番に出た状態だけを置く。ここにあるコミットはすべて「リリース済み」 | 永続 |
| develop | 次のリリースに向けて開発中のものを統合する場所。「次の束」の中身 | 永続 |
| feature/xxx | 機能 1 つの作業。develop から切って、できたら develop へ戻す | 機能ができるまで |
| release/x.y | 「そろそろ出す」と決めた時点で develop から切る。不具合修正だけ。QA が終わったら main と develop の両方へマージし、バージョンタグを打つ | 出荷準備の間だけ |
| hotfix/xxx | 本番の緊急修正。main から切って直し、main と develop の両方へ戻す | 修正の間だけ |
main ──●────────────────●(v1.0)──────●(v1.0.1)──────●(v1.1)──
\ ↑ ↑ hotfix ↑
develop ────●──●──●──●──●──┼──●──●──●───┼──●──●──●──●──┤
\ / \ / │ │ │
feature ●──● ●──● │ │ │
release/1.0 ─────┘ release/1.1
Git Flow が向く条件
- 出荷がバージョン単位(パッケージソフト、アプリストア配布、顧客ごとに導入するもの)
- QA 期間があり、その間も次の開発を止めない
- 複数バージョンを同時に保守する
用語
QA 期間
- 通常の説明: QA は Quality Assurance(品質保証)。リリース候補のコードを凍結し、テスト担当が仕様どおり動くか、既存機能が壊れていないか、性能や互換性に問題が無いかを体系的に検証する期間。この間は新機能を入れず、不具合の修正だけを行う
- 平たく言うと: 「出す前に、いったん手を止めて、みんなで一通り使ってみる期間」。料理なら、盛り付けが終わってから客に出す前に味見と見た目の確認をする時間。その間は新しい具材を足さず、塩加減の直しだけをする
旧バージョンの保守
- 通常の説明: 新しいバージョンを出した後も、古いバージョンを使い続けている利用者のために、古い側にも不具合修正やセキュリティ修正を提供し続けること。複数のバージョンが同時に稼働するため、系統ごとにブランチを保つ
- 平たく言うと: 「新型を出した後も、旧型を使っている人のために旧型の修理を続ける」こと。車のメーカーが新モデルを出しても旧モデルの部品供給とリコール対応を続けるのと同じ
うちに合わない理由
- 3 製品とも継続デプロイ。マージした PR がそのまま本番に出る。多い日は 1 日 5 回。バージョンという束が存在しない
- 検証は PR ごと(CI の回帰テスト + プレビュー環境)で済み、develop に溜める期間が無い
- 利用者は全員が常に最新の 1 つを使う(自分でバージョンを選べない)ので、旧バージョンが存在せず、その保守も要らない
- 開発者は 3 人 + AI。統合の衝突は PR 単位で受け止められる
この状況で develop を持つと、本番前の統合場所がもう 1 つ増えるだけで、そこに溜まったものと main がずれていく。実際に 1 つのプロジェクトで、同じ変更を develop 用と main 用に別々にコミットする運用になり、ステージングが本番と違う構成で動いていた。
代わりに何をするか
Git Flow を簡略化した GitHub Flow(main + 短命の作業ブランチ + PR、マージで本番)に、PR ごとのプレビュー環境と機能フラグを足した形。
- 「今週の分をまとめて金曜に出したい」となったら: develop ではなく、短命の release ブランチ(金曜に main へマージして消す)か、機能フラグで「本番に入れるが表示しない」
- 「大きな機能を数週間かけて作る」なら: 機能ブランチを長く持つのではなく、機能フラグの裏で小さく PR を重ねる(トランクベース開発)
Git Flow 自体を否定するものではない。提唱者本人も 2020 年に「Web アプリで継続デプロイするなら、もっと単純な流れのほうがよい」と注記を出している。
develop を消す段取り
一気に消すのではなく、順に片付けてから消す。
- ステージングの DB の migration 履歴を main の系列に揃え直す
- develop にしか無い価値ある変更を、main 宛ての PR で出し直す
- ステージングのデプロイを PR ブランチからに変える(プレビュー環境)
- develop を凍結し、個人ブランチへの自動同期 bot を削除する
- main 取込済みの古い個人ブランチを削除する(持ち主の了承後)