【Git・GitHub操作ガイド】第13章 図解:Gitブランチ戦略、もう迷わない!GitHub FlowからTBDまで、プロが選ぶ5つのベストプラクティス

図解:Gitブランチ戦略、もう迷わない!GitHub FlowからTBDまで、プロが選ぶ5つのベストプラクティス

「深夜2時、やっとの思いで実装した機能。『よし、コミットして寝よう』。メッセージに『修正』とだけ打ち込み、Pushボタンを押す。…翌月、チームリーダーから『この“修正”って、どの課題の、何に対する修正ですか?』とメンションが。1ヶ月後の自分は、この変更の意図を思い出せるだろうか?」

こんな経験、ありませんか?あるいは、これからチーム開発に飛び込むあなたが、まさに抱いている不安かもしれません。

この記事では、そんなあなたの悩みを解決します!世界中の開発チームが実践している「ベストプラクティス(最善の方法)」を5つの観点から厳選してご紹介。これらを実践すれば、チームの開発がもっとスムーズになり、コードの品質もぐっと上がりますよ。

この記事を読めば、あなたは…

  • チーム開発の「迷子」から卒業できます
  • 未来の自分や仲間が感謝する「分かりやすい」コミットが書けるようになります
  • プロの現場で使われる、再現性の高い開発フローが身につきます

この記事の対象読者

  • Gitの基本操作は覚えたが、チームでの効果的な使い方に悩んでいる方
  • これからチーム開発に参加するにあたり、現場の「常識」を知っておきたい学生や初級エンジニア
  • 開発チームのリーダーで、コード管理のルールを整備したいと考えている方
  • 自己流でGitを使ってきたが、標準的なベストプラクティスを学び直したい方

目次


はじめに:なぜ「型( kata )」を知ると開発が楽になるのか?〜先人の知恵を借りよう〜

GitとGitHubはとても柔軟なツール。だからこそ「私たちのチームでは、どういうルールで使おう?」と迷ってしまうことも多いですよね。でも、心配ありません。実は、多くの開発チームが試行錯誤の末に見つけ出した、うまくいくための「型」や「作法」があるんです。これを真似ることで、「車輪の再発明」(※すでにある解決策を、もう一度ゼロから作ってしまうこと。英語では “reinventing the wheel” と言います)を避け、効率よく開発を進めることができます。

この記事を読み終える頃には、あなたは自信を持って「私たちのチームでは、このブランチ戦略を採用し、このようなコミット規約で進めましょう」と提案できるようになっているはずです。

それでは、プロの開発現場で使われている「5つのルール」を一緒に見ていきましょう!


1. ブランチ戦略:開発の「交通ルール」を決めて、衝突を防ごう!

概要:

どのようにブランチを作成し、統合していくかという、チーム全体のワークフローの「交通ルール」です。一貫した戦略を持つことで、混乱を防ぎ、誰もが安心して作業を進められます。 主な戦略を道路交通に例えるなら…

  • GitHub Flow: 「一本道」。みんなが同じ本線(main)を目指しますが、追い越し(新機能開発)の際は必ず専用レーン(フィーチャーブランチ)に入り、合流前には厳しいチェック(レビュー)を受けます。
  • GitFlow: 「高速道路と一般道」。普段の開発は一般道(develop)を走り、リリースという目的地が近づくと高速道路(releaseブランチ)に乗ります。緊急車両(hotfix)専用のレーンも完備されています。
  • Trunk-Based Development: 「未来の超高速道路」。車線(ブランチ)はほぼ一つ(main)しかありません。全自動運転車(開発者)が小さな改良を加えながら、常に本線を走り続けます。代表的な戦略を、シンプルなものから順に見ていきましょう。

私たちのチームに合う戦略はどれ?フローチャートで診断!

たくさんの戦略があって、どれを選べばいいか迷いますよね。まずは、あなたのプロジェクトにどの戦略が合いそうか、簡単なフローチャートで診断してみましょう!

あなたのプロジェクトにどの戦略が合いそうか、フローチャートで診断

[TIP]診断結果の見方
このチャートはあくまで目安です。もし迷ったら、まずは最もシンプルで多くの現場で採用されている「GitHub Flow」から試してみるのがおすすめです。 この記事では、それぞれの戦略を詳しく解説していくので、診断結果を参考にしながら読み進めてみてください。


各戦略の比較早見表

戦略名最適なプロジェクトメリットデメリット
GitHub FlowWebサービス、頻繁なリリースシンプル、高速なリリースサイクル厳密なバージョン管理には不向き
GitLab Flowステージング環境が必要なアプリ環境ごとの分離、デプロイ制御が容易GitHub Flowよりやや複雑
GitFlowパッケージ、モバイルアプリ厳格なバージョン管理、堅牢複雑、頻繁なリリースには重い
TBDDevOpsが成熟した大規模チームマージ地獄の回避、CI/CDとの親和性◎高度な自動テスト文化が必須

推奨される戦略:

GitHub Flow (ギットハブフロー):

  • 内容:
    多くのWebアプリケーション開発で採用されている、シンプルかつ強力な戦略です。以下の2つの原則に基づいています。
    1. mainブランチは、常にデプロイ可能な状態(いつでも本番リリースできる品質)に保つ。
    2. 新しい作業は、必ずmainから説明的な名前のブランチ(フィーチャーブランチ)を作成して行う。
    3. 作業完了後、Pull Requestを通じてレビューを受け、mainにマージされると、CI/CD(継続的インテグレーション/継続的デリバリー)によって自動的にテスト&デプロイされるのが理想的な流れです。
  • 適している場面:
    頻繁にリリースを行うWebサービスやアプリケーション。CI/CDと組み合わせることで真価を発揮します。この記事で学ぶ最初の戦略として最適です。
GitHub Flow
図解:GitHub Flow

GitLab Flowでの機能開発 (ギットラボフロー):

  • 内容:
    GitHub Flowをベースに、環境ブランチ の考え方を取り入れた戦略です。
    例えば、mainブランチへのマージでステージング環境へ自動デプロイし、問題がなければ、次にmainブランチからproductionブランチへマージすることで本番環境へリリースする、といった段階的なデプロイを実現します。
  • 適している場面:
    本番リリースの前に、ステージング環境などで十分なテストを行いたいプロジェクト。
    デプロイのタイミングをより細かくコントロールしたい場合に有効です。
GitLab Flow
図解:GitLab Flow
  • GitLab Flowでの不具合対応(ホットフィックス)
    productionブランチで緊急の不具合が発見された場合は、productionブランチから直接修正用のブランチを作成します。修正が完了したらproductionにマージしてリリースし、その後、必ずmainブランチにも修正内容を取り込みます(バックマージ)。
GitLab Flowでのホットフィックス
図解:GitLab Flowでのホットフィックス

GitFlow (ギットフロー):

  • 内容:
    mainの他にdevelop(開発用)、release(リリース準備用)、hotfix(緊急修正用)といった専用のブランチを厳格に使い分ける、より複雑で堅牢な戦略です。2010年にVincent Driessen氏によって提案された、歴史あるモデルです。
  • 適している場面:
    明確なバージョン管理が必要な、パッケージソフトウェアやモバイルアプリのリリースに適しています。Webアプリケーションなど、頻繁にデプロイを行うプロジェクトには、やや複雑すぎる場合があります。
GitFlowのブランチモデル
図解:GitFlowのブランチモデル

Trunk-Based Development (トランクベース開発): DevOps時代の主流

  • 内容:
    開発者全員が常にmain(トランク)ブランチという一本の幹に対して、小さな変更を頻繁に直接コミットしていく戦略です。数日以上にわたる長命なフィーチャーブランチは作りません。
  • なぜ今、TBDなのか?:
    GitHub Flowのような戦略でも、機能開発が大規模になるとフィーチャーブランチが数週間存在し続けることがあります。
    これは、mainブランチとの差分がどんどん大きくなり、最終的なマージ作業が非常に困難になる「マージ地獄」を引き起こす原因となります。
    TBDは、この問題を根本的に解決し、継続的インテグレーション(CI)を真の意味で実現するための戦略として、Googleなどの先進的な企業で採用されています。
  • 未完成の機能はどうするの? → フィーチャーフラグ
    TBDでは未完成のコードもmainブランチにマージされますが、ユーザーに影響が出ないように「フィーチャーフラグ(Feature Flag)」という仕組みを使います。
    これは、コード内に埋め込まれたON/OFFスイッチのようなもので、特定の機能がユーザーに見えるかどうかを動的に制御できます。
フィーチャーフラグの概念イメージ
図解:フィーチャーフラグの概念イメージ

フィーチャーフラグは、概念的には以下のようなコードで実現されます。

// フィーチャーフラグを使った新機能の出し分け例(Reactの疑似コード)

function ProfilePage({ user, flags }) {
  return (
    <div>
      <h1>{user.name}</h1>

      {/* 'new-profile-design' フラグがONの場合のみ、新しいデザインを表示 */}
      {flags.is('new-profile-design') ? (
        <NewProfileLayout user={user} /> 
      ) : (
        <OldProfileLayout user={user} />
      )}

    </div>
  );
}

このように、リリース後でも安全に機能をON/OFFできるため、「リリース」と「機能の公開」を分離できるのが大きなメリットです。実際には、LaunchDarklyFlagsmithのような専用の管理サービスを利用することも多くあります。

  • 適している場面:
    自動テストとCI/CDが高度に成熟し、迅速なリリースサイクルが求められるDevOps環境。
    GoogleのDORA (DevOps Research and Assessment) レポートでも、TBDはソフトウェアデリバリのパフォーマンスを向上させる重要な要素として挙げられています。
    DevOpsの専門家であるPaul Hammant氏が提唱するこのモデルは、現代のアジャイル開発における重要な潮流ですので、ぜひ知っておきましょう。

2. コミット規約:「未来への手紙」で、変更の”なぜ”を伝えよう

概要:

「修正」「対応」だけのコミットメッセージ、書いてしまっていませんか?
git logで表示されるコミット履歴は、未来の自分や新しい仲間がコードを理解するための、いわば「プロジェクトの航海日誌」(公式な歴史書, official history book)です。
良いメッセージは「何をしたか(What)」だけでなく、「なぜそれをする必要があったのか(Why)」を教えてくれます。

推奨される規約: Conventional Commits

内容: タイプ(スコープ): 概要 という形式でメッセージを記述する規約です。

  • feat: 新機能(feature)の追加 (feat: ユーザー認証機能を追加)
  • fix: バグの修正 (fix: ログイン時のリダイレクト問題を修正)
  • docs: ドキュメントの変更 (docs: READMEに使用方法を追記)
  • refactor: リファクタリング(※コードの振る舞いは変えずに、内部構造をきれいに整理すること) (refactor: 認証ロジックをサービスクラスに分離)
  • test: テストの追加・修正
  • chore: ビルドプロセスや補助ツールの変更

メリット:

履歴の可読性が向上するだけでなく、この規約に従うことで、リリースノートの自動生成などが可能になります。
元々はAngularチームのコミット規約から着想を得たもので、現在では多くのオープンソースプロジェクトで採用されています。その仕様は公式サイト(https://www.conventionalcommits.org/)で定義されています。
GoogleやAtlassianといった企業のGitチュートリアルでも、このような規約の重要性が強調されています。

こんなコミット、書いていませんか?(悪い例)

修正
Add user page

Conventional Commitsならこう変わる!(良い例)

fix(login): パスワード再設定後のリダイレクト先を修正
feat(user): ユーザープロフィール表示機能を追加

[TIP]まずは feat と fix から
「どのタイプを使えばいいか迷う…」という方は、まずは新機能を追加するときのfeatと、バグを修正するときのfixの2つを使い分けることから始めてみましょう!


3. マージ戦略:mainブランチの歴史を「一本の美しい幹」にしよう

概要:

Pull Requestをマージする方法はいくつかありますが、mainブランチの歴史をいかにクリーンで理解しやすく保つかが選択の基準となります。

推奨される戦略: Squash and Merge (スカッシュ&マージ)

[NOTE] 図解:Squash and Mergeの前後比較

マージ前:Pull Requestの履歴

マージ前:Pull Requestの履歴

マージ後:mainブランチの履歴

マージ後:mainブランチの履歴

内容:

PR内の複数のコミット(「タイポ修正」「WIP(作業中)」といった試行錯誤の跡)を、意味のある1つのコミットにまとめてからmainブランチに取り込みます。

例えるなら、夏休みの宿題の日記です。 毎日「一行だけ書いた」「絵を描き足した」「誤字を直した」という記録が残っていると、あとから先生が見たときに何が重要だったのか分かりにくいですよね。Squash and Mergeは、その日々の試行錯誤を「8月1日:昆虫採集に行き、カブトムシを捕まえた」という、完成された1日の出来事にまとめて提出するようなイメージです。

[NOTE] [著者の経験談]
私もGitの経験が浅い頃、「WIP」や「typo修正」といったコミットを大量に含んだPull Requestをそのままマージしてしまい、後からmainブランチの履歴を追うのに非常に苦労した苦い経験があります。誰が、いつ、どの機能を追加したのかが一目でわからず、バグの原因調査に余計な時間がかかってしまいました。だからこそ、mainの歴史は「機能単位」でクリーンに保つことが重要です。

メリット:

mainブランチの歴史が、「どの機能がいつ追加されたか」という単位で非常にクリーンになります。個々の試行錯誤の歴史はPR内に残るため、詳細を追いかけることも可能です。多くのチームにとって、最もバランスの取れた選択肢です。一方で、詳細な作業履歴がmainブランチのログからは見えなくなるという側面もあります。しかし、ほとんどの場合、その詳細な履歴はPull Request内で確認できれば十分です。


4. バージョン管理:リリースには「意味のある名前」を付ける

概要:

プロジェクトのリリースポイントには、誰が見てもバージョンがわかるようなタグを付けるべきです。

推奨される規約: Semantic Versioning (セマンティック・バージョニング)

  • 内容: vMAJOR.MINOR.PATCH (例: v1.2.3) という形式でバージョンを管理します。
    • MAJOR: 後方互換性のない大きな変更
    • MINOR: 後方互換性のある新機能の追加
    • PATCH: 後方互換性のあるバグ修正
  • メリット: バージョン番号を見るだけで、そのリリースがどの程度の変更を含んでいるのかを、ユーザーや開発者が推測できるようになります。

5. 品質保証の自動化:CIとレビューで「品質の門番」を置く

概要:

人間の注意力には限界があります。どんなに気をつけていても、ミスは起こるものと考えます。だからこそ、品質は個人の頑張りだけに頼るのではなく、「仕組み」で担保することが重要です。

推奨される実践:

  • テストとビルドを必ず自動化する: GitHub Actionsを使い、すべてのPull Requestで自動的にテストが実行されるように設定しましょう。これは、今や多くの開発現場で「当たり前の習慣」になっています。
  • 「ピアレビュー(仲間による相互チェック)」を必須にする: ブランチ保護ルールを使い、mainブランチへのマージには、作成者以外の最低1人からのレビュー承認を必須としましょう。これにより、コードの属人化(※特定の人しかやり方が分からず、その人がいないと作業が進まない状態)を防ぎ、知識の共有を促進します。

mainブランチへのマージは、レビューをしっかりとやって、安全に進めましょう!以下の記事で詳細に解説していますので、是非ご覧ください。


よくある質問(FAQ)

Q. ブランチ名はどのように付けるべきですか?

A. チームで一貫した命名規則を持つことが重要です。一般的には [タイプ]/[説明] の形式がよく使われます。例えば、feat/add-login-page(機能追加)、fix/header-layout-bug(バグ修正)、refactor/user-model(リファクタリング)などです。これにより、ブランチ名を見るだけで作業内容が推測できます。

Q. コミットメッセージは英語で書くべきですか?

A. プロジェクトによりますが、グローバルなチームやオープンソースプロジェクトでは英語が標準です。英語で書くことで、世界中の開発者が文脈を理解しやすくなります。チームが日本人だけであっても、将来の拡張性を考えて英語で書く習慣をつけることは良い練習になります。迷ったらチームで話し合って決めましょう。

Q. git rebasegit mergeはどちらを使うべきですか?

A. これは長年の議論の的ですが、多くのチームで採用されている安全なルールは「フィーチャーブランチ内ではrebaseを使い、mainへの合流はmerge(またはSquash and Merge)を使う」というものです。

  • rebase: フィーチャーブランチをmainの最新状態に追従させるために使います。コミット履歴が一直線になり綺麗ですが、複数人で作業している共有ブランチで使うと、履歴が書き換えられて大混乱を招く危険性があります。個人の作業ブランチでのみ使うのが原則です。
  • merge: mainブランチに機能を取り込む際に使います。マージコミットが残るため安全ですが、履歴が複雑になりがちです。この問題を解決するのが、本記事で推奨しているSquash and Mergeです。

初心者のうちは、まず安全なmergeに慣れ、rebaseは自分のローカルブランチを整理する目的で試してみるのが良いでしょう。

Q. 小さな修正でもPull Requestは必要ですか?

A. はい、原則として必要です。たとえ1行のタイポ修正であっても、Pull Requestを通じてレビューを受けることで、他のメンバーが変更を認識できます。また、CI(自動テスト)をトリガーするきっかけにもなり、品質を担保する上で重要なプロセスです。


参考資料


まとめ:今日からできる、はじめの一歩

ベストプラクティスと聞くと難しく感じるかもしれませんが、大切なのはチームで話し合い、少しずつ試してみることです。

まずは、次のPull Requestを作成するときに、

  • コミットメッセージをfeat:fix:から始めてみる
  • mainブランチへのマージは「Squash and Merge」を選択してみる
    ことからチャレンジしてみてはいかがでしょうか?

小さな一歩が、未来の開発効率を大きく変えるはずです。

この記事を読んだあなたが、チームのヒーローになる番です! ぜひ、チームメンバーとこの記事を共有し、「私たちのチームでも、まずはコミットメッセージのルールから試してみませんか?」と提案してみてください。


Gitの基本操作にまだ不安がありますか?
もしgit addgit commitの基本から復習したい場合は、こちらの「初心者向けGit入門ガイド」も合わせてお読みください。

この記事が役に立ったら
ぜひチームに共有したり、X(旧Twitter)で感想をポストしていただけると、執筆の励みになります!あなたの小さなアクションが、日本の開発文化をより良くする大きな一歩になるかもしれません。


本記事をご利用いただくにあたって

この記事は、公開時点(2025年9月)の情報に基づき、正確な情報を提供するよう努めています。

しかし、本記事で解説するソフトウェアやサービスの仕様は日々更新されるため、記事内で紹介している画面や手順が、ご覧いただいている時点では変更されている可能性があります。

もし内容に相違がある場合は、各サービスの最新の公式ドキュメントも併せてご参照ください。本記事の情報を利用される際は、ご自身の判断と責任においてお願いいたします。


SNSでもご購読できます。

コメントを残す

*