🦁

Trunkベース開発が意外と良いらしい

に公開

はじめに

最近、所属している開発チームでブランチ戦略の見直しがありました。そこで「Trunkベース開発」という話題があがったので、気になって調べてみたので共有します。
まだ、執筆時点(2025年4月7日)で導入前なので、あくまで「調べて分かった範囲」で書いています。導入後に、「やっぱり別のブランチ戦略の方が良かったな」となれば、改めて共有します。

現在所属している開発組織の概要

まず、私の所属している開発組織の特徴について以下に簡単にまとめました。

人数 コミット頻度 リリース頻度
6~7人(フロント、バック合わせて) ほぼ毎日 週に3回~4回

Trunkベース開発の基本

Trunkベース開発とは、常に最新の状態にある単一の共有ブランチ(trunk、main、またはmasterと呼ばれることが多い) を中心に開発を進める手法です。開発者は、このtrunkから短い期間だけ存在するフィーチャーブランチを作成し、作業が完了したら速やかにtrunkにマージ(統合)します。

Trunkベース開発の主な特徴

  • 単一の長期生存ブランチ: 開発の基盤となるのは、常に最新でデプロイ可能な状態を目指す単一のブランチです。
  • 短命なフィーチャーブランチ: 新機能の開発やバグ修正は、trunkから作成された短い期間だけ存在するブランチで行われます。
  • 頻繁なマージ: 開発者は、小さな変更を頻繁にtrunkにマージします。これにより、コンフリクトのリスクを減らし、常に最新のコードベースで作業できます。
  • 継続的インテグレーション(CI)/継続的デリバリー(CD)との親和性: 頻繁なマージと自動テストを組み合わせることで、CI/CDパイプラインを効率的に実現できます。

Git-Flow、GitHub-Flowとの比較

Gitの主要なブランチ戦略であるGit-FlowとGitHub-Flow、そしてTrunkベース開発の違いをまとめました。

手法 主要ブランチ フィーチャーブランチ リリースブランチ その他ブランチ マージ頻度 主な目的
Trunkベース開発 trunk/main 短命 (必要に応じて) - 高い 頻繁な統合、CI/CDの促進、開発サイクルの短縮
Git-Flow main/develop 長命 release hotfix 低い 複数バージョンの同時管理、計画的なリリース
GitHub-Flow main 短命 - - 中程度 シンプルなワークフロー、継続的デプロイメント
  • Git-Flow は、複数の長期生存ブランチを持ち、リリース準備のための専用ブランチを使用するため、計画的なリリースに向いています。しかし、ブランチ間のマージが多く、コンフリクトが発生しやすい傾向があります。
  • GitHub-Flow は、単一の主要ブランチと短命なフィーチャーブランチを使用するシンプルなワークフローで、継続的デプロイメントに適しています。
  • Trunkベース開発 は、さらにブランチ数を減らし、極めて頻繁なマージを推奨することで、コンフリクトのリスクを最小限に抑え、開発サイクルを高速化します。

Trunkベース開発のメリット

Trunkベース開発には、以下のような多くのメリットがあります。

  • マージコンフリクトの低減: 小さな変更を頻繁にマージするため、複雑なマージコンフリクトを大幅に減らせます。
  • 開発サイクルの高速化: 常に最新のコードベースで作業でき、早期に他の開発者の変更を把握できるため、手戻りが減り、リリースまでの時間を短縮できます。
  • コードレビューの効率化: 小さな変更単位でのプルリクエストはレビューしやすく、質の高いレビューにつながります。
  • チームのコラボレーション促進: 全ての開発者が共通のコードベースで作業することで、チーム内の連携と知識共有が促進されます。
  • CI/CDとの親和性: 頻繁なマージと自動テストの組み合わせにより、CI/CDパイプラインの構築と運用が容易になります。
  • ブランチ管理のコスト削減: 長期生存ブランチや多数の補助ブランチの管理が不要になるため、ブランチ戦略に関するオーバーヘッドを削減できます。

Trunkベース開発が向いている開発規模と組織

Trunkベース開発は、以下のような開発規模や組織で特に効果を発揮します。

  • 比較的小規模なチーム: チーム内のコミュニケーションが密で、頻繁なマージやコードレビューをスムーズに行えるチーム。
  • CI/CDを重視するチーム: 自動テストやデプロイの仕組みが整っており、開発からリリースまでのサイクルを高速化したいチーム。
  • 頻繁なリリースを必要とするプロジェクト: 顧客からのフィードバックを素早く反映したり、市場の変化に迅速に対応する必要があるプロジェクト。
  • 技術的な成熟度が高いチーム: Gitの操作に慣れており、高品質なコードを維持するための規律があるチーム。
  • フィーチャーフラグを活用できるチーム: 未完成の機能をtrunkにマージしても、本番環境で非表示にできる仕組みがある場合。
    ただし、大規模なチームや複雑なプロジェクトであっても、適切なプラクティス(頻繁なコミュニケーション、厳格な自動テスト、フィーチャーフラグの活用など)を導入することで、Trunkベース開発のメリットを享受できる可能性があると思います。

まとめ

様々なブランチ戦略がありますが、それぞれの開発組織にあったものを選ぶことが前提であり、そこから生まれる課題に対して柔軟に対応していくことが重要と思いました。また、世間ではどのようなブランチ戦略を取っていて、そこから生まれる課題に対してどのような対策を取っているのか気になったので、今後もアンテナを張って情報収集していこうと思います。

Discussion