#4 Git Flowブランチ戦略でチームの混乱を防ぐ - Python OSS開発記録
python 13 min read

#4 Git Flowブランチ戦略でチームの混乱を防ぐ - Python OSS開発記録

avatar-m-1

karrinn

著者

コミュニティヘルスファイルまで整備した、次は?「どのブランチで作業すればいいの?」で混乱させないために、ブランチ戦略を決めます
今回はGit Flowを採用したwagtail-reusable-blocksを例に、ブランチの役割分担と命名規則を振り返ります。

KEY TAKEAWAYS

この記事でわかること

  • Git Flowの7種類のブランチと役割分担
  • GitHub Flow vs Git Flowの使い分け
  • ブランチ戦略なしで起きる3つの悲劇

用語の定義

TERM 01

Git Flow

Vincent Driessen氏が2010年に提唱したブランチ戦略モデル。main・developの2本柱に、feature・fix・hotfixなどの短命ブランチを組み合わせる。

TERM 02

GitHub Flow

GitHubが推奨するシンプルなブランチ戦略。mainブランチ1本 + feature branchのみ。CI/CDが整備されてる環境向け。

TERM 03

Long-lived Branch

削除されず常に存在するブランチ。main(プロダクション)、develop(開発統合)など。Git Flowでは2本。

TERM 04

Short-lived Branch

作業完了後に削除される短命ブランチ。feature・fix・hotfix・chore・docsなど。マージしたら即削除が鉄則。

なぜブランチ戦略が必要?

前回までで、ドキュメントは整備しました。でも「どのブランチで作業すればいいの?」「mainに直pushしていいの?」が決まってないと、チームが混乱します。

実はこれも、OSSだけの話じゃなく、企業プロジェクトで超よく見る問題なんです。

悲劇1

「mainに直push → 本番が壊れる → 大惨事」

悲劇2

「みんながfeature/xxxで作業 → マージ地獄」

悲劇3

「緊急修正どこで? → 探す時間で障害拡大」

解決策: ブランチ戦略を事前に決めて明文化すれば、この3つ全部解決します。

wagtail-reusable-blocksではGit Flowを採用。CONTRIBUTING.mdに書いたので、「どこにPR出せばいい?」の質問ゼロ。

Git Flow vs GitHub Flow

まず、どのブランチ戦略を採用するかを決めます。有名なのは2つ。

2つの選択肢

項目Git FlowGitHub Flow
Long-lived Branchmain + develop(2本)main のみ(1本)
リリースタイミング計画的リリース(月1回など)いつでもリリース(mainマージ = デプロイ)
向いてる ・ライブラリ/パッケージ開発
・バージョン管理が重要
・複数バージョンサポート
・Webアプリ
・CI/CD完備
・継続的デプロイ
複雑さやや複雑(ブランチ7種類)シンプル(ブランチ2種類)
Hotfix対応hotfixブランチで即対応mainから直接修正

wagtail-reusable-blocks → Git Flow採用

結論から言うと、Git Flowを選びました。理由は3つ。

理由1

PyPIパッケージ開発 → バージョン管理重要

理由2

計画的リリース → v0.1.0、v0.2.0と段階的

理由3

複数バージョンサポート → v0.1.x系も保守

使い分けの目安

  • Git Flow: ライブラリ・CLI・モバイルアプリ(リリース計画が必要)
  • GitHub Flow: Webサービス・SaaS(デプロイ自動化済み)
  • 迷ったらGitHub Flowから始めるのが無難(シンプルなので)

Git Flowの7種類のブランチ

Git Flowでは、役割ごとにブランチを使い分けます。wagtail-reusable-blocksでの実例を見ていきましょう。

ブランチの役割分担

Long-lived Branches(常に存在)

ブランチ役割保護デプロイ
main本番リリース
・PyPI公開済みコード
・常に安定
・タグ付け(v0.1.0など)
✅ 必須PyPI公開
develop開発統合
・次回リリース候補
・feature/fixのマージ先
・デフォルトブランチ
✅ 必須TestPyPI

Short-lived Branches(作業後削除)

ブランチ用途BaseMerge To
feature/*新機能開発developdevelopfeature/1-reusable-block-model
fix/*バグ修正developdevelopfix/12-circular-reference
hotfix/*緊急修正(本番)mainmain + develophotfix/15-security-patch
chore/*雑務(設定・依存更新)developdevelopchore/update-dependencies
docs/*ドキュメント更新developdevelopdocs/api-reference

ブランチ命名規則

wagtail-reusable-blocksでは、Issue番号を含めるルールにしました。

命名パターン

Format
<type>/<issue-number>-<short-description>

例:
feature/1-reusable-block-model
fix/12-circular-reference-detection
hotfix/15-security-patch
chore/update-dependencies
docs/fork-contribution-guide

Issue番号を含めるメリット

  • git branch -aで見ただけで、何のIssueか分かる
  • PR作成時に自動でIssueとリンクされる
  • 後から「このブランチ何だっけ?」がなくなる

実際の開発フロー

理論は分かった、実際にどう動くかを見ていきましょう。

パターン1: 新機能開発

一番よくあるパターン。feature/xxxブランチで開発します。

流れ:

  1. developから新ブランチ作成
  2. 機能実装 + テスト
  3. PR作成(develop向け)
  4. レビュー → マージ
  5. ブランチ削除
Bash
# 1. developから新ブランチ
git checkout develop
git pull origin develop
git checkout -b feature/11-reusable-block-model

# 2. 実装
# ... コード書く ...
git add .
git commit -m "feat: add ReusableBlock model"

# 3. Push & PR作成
git push origin feature/11-reusable-block-model
# GitHub UIでPR作成(develop向け)

# 4. マージ後、ローカルブランチ削除
git checkout develop
git pull origin develop
git branch -d feature/11-reusable-block-model

パターン2: 緊急修正(Hotfix)

本番でセキュリティバグ発見みたいな緊急事態。hotfix/xxxを使います。

特徴:

  • mainブランチから作成
  • main + developの両方にマージ
  • 即リリース(v0.1.1など)

developにもマージする理由: hotfixの内容を次回リリースにも反映させるため。

Bash
# 1. mainから新ブランチ
git checkout main
git pull origin main
git checkout -b hotfix/15-security-patch

# 2. 修正
git add .
git commit -m "fix: patch security vulnerability"

# 3. mainにマージ
git checkout main
git merge hotfix/15-security-patch
git tag v0.1.1
git push origin main --tags

# 4. developにもマージ
git checkout develop
git merge hotfix/15-security-patch
git push origin develop

# 5. hotfixブランチ削除
git branch -d hotfix/15-security-patch

パターン3: リリース

developが安定したら、mainにマージしてリリース

流れ:

  1. developからmainへPR
  2. 最終確認(テスト全部通ってる?)
  3. マージ
  4. タグ付け(v0.1.0)
  5. PyPI公開(GitHub Actionsで自動)
Bash
# 1. GitHub UIでPR作成
# develop → main

# 2. マージ後、タグ付け
git checkout main
git pull origin main
git tag v0.1.0
git push origin v0.1.0

# 3. GitHub Actionsが自動で:
# - Release作成
# - PyPI公開
# - Release notes生成

ポイント: wagtail-reusable-blocksでは、タグをpushするとGitHub Actionsが自動でPyPI公開してくれます(次回以降の記事で解説)。

よくある間違いと対策

Git Flowを導入しても、使い方を間違えると意味がないです。よくある失敗例を見ておきましょう。

間違い集

間違い1: mainに直push

「小さい修正だから...」→ 本番破壊

対策:

mainを保護(次回トピック#5で設定)

間違い2: ブランチ消し忘れ

マージ後も残る → ゴミだらけ

対策:

PR設定で「マージ後自動削除」ON

間違い3: developからmainに直マージ

レビューなし → バグ混入

対策:

PR必須(保護設定で強制)

間違い4: 命名規則バラバラ

feature-xxx, feat/xxx混在

対策:

Rulesetsで命名強制(トピック#6)

すべて自動化で防げます

次回のトピック#5「GitHub Rulesetsでブランチ保護」で、これらの間違いを技術的に防止する方法を解説します。人の注意に頼らない仕組み作りが重要。

OSS vs 企業プロジェクト: Git Flowが果たす役割

OSS: 多様なコントリビューターの整理

OSSプロジェクトでは、様々なスキルレベルの人が参加します。
「どのブランチで作業すればいいの?」が明確でないと、混乱が生まれます。

Git Flowでブランチの役割を明確にすれば、初めての人でも迷わず作業できる
「新機能ならfeature/」「バグ修正ならfix/」というルールがあるだけで、参加ハードルが下がります。

メリット

  • 役割の明確化: ブランチ名を見ただけで「何の作業か」が分かる
  • 並行開発: 複数の機能開発・バグ修正が同時進行できる
  • リリース管理: mainブランチ = 常に本番環境デプロイ可能な状態

コントリビューターに優しい: 「このブランチで作業していいのかな?」と不安にならない。
ルールが明確なら、誰でも安心して参加できる

企業: 「萎縮による開発効率の激減」を防ぐ

筆者が知る限り、日本の企業、特に大企業ほど深刻な問題があります。

「あれをやるな、これをやるとシステムが壊れる」と脅され続けた新人は、必要以上に慎重になります。
結果、開発効率が想像の何倍も下がる。異常なスローペースで開発が進むことになります。

問題の根本原因

  • 不十分な説明: 何もかも漏れずに説明するのは難しい(記憶する方も無理)
  • 脅しによる教育: 「これをやるとシステムが壊れる」と言われ続ける
  • 萎縮: 新人は必要以上に慎重になり、「えいってやってみる」ができない
  • 経験値が溜まらない: 失敗を恐れて試せないので、成長が遅い

Git Flowによる解決: 役割の明確化 = 心理的安全性

Git Flowでブランチの役割を明確にすれば、「どこで作業すればいいか」が分かる
「feature/で作業すればいい」「mainには直pushしない」というルールが明確なら、安心して作業できる

さらに、次回(Topic #5)で解説するGitHub Rulesetsによる技術的制限を組み合わせれば:

  • システムで防御: mainに直pushしようとしても、システムが弾く
  • 失敗しても大丈夫: 間違えたらシステムが教えてくれる
  • えいってやってみることができる: 失敗を恐れずに試せる
  • 経験値が遥かに溜まりやすい: 安心して失敗できる環境 = 成長が早い

安心して失敗できる環境:できることは何やってもいい。失敗したらシステムが弾いてくれる。
これは教育の本質です(筆者は過去、数年間IT系専門学校で担任をつとめ、システム開発関連科目の講義を担当していました)。失敗を恐れずに試せる環境こそが、人を育てます。

プロジェクト管理の責任

システム側の知識・理解がある人がプロジェクト管理をすべきです。

開発経験のない「マネジメントいっぱいしてきました」みたいな人に仕切らせてはいけません。
技術を理解していない人は、「人間に任せる」ことしかできない。
技術を理解している人は、「システムで防御する」ことができる。

重要: Git Flowは「ルールを決める」だけ。次回のTopic #5で、技術的に間違いを防止する方法を実装します。
人間の記憶や注意に頼らない仕組み作りが、チーム全体の生産性を劇的に向上させます。

参考リンク

プロジェクト関連

公式ドキュメント

参考事例

関連トピック

コメント (0)

まだコメントはありません。最初のコメントを残しませんか?

コメントを投稿

メールアドレスが公開されることはありません。必須項目には * が付いています