ブランチのマージ — 意味、マージ方法とコンフリクト解決

著者: IT Sectr 公開日: 2026-08-01 読了時間: 6 分

マージする、または統合する — これはGitで2つのブランチを結合し、あるブランチから別のブランチへ変更を統合する操作です。現代の開発では、マージはフィーチャーブランチをプロジェクトのメインブランチに統合する標準的な方法です。GitHub Octoverse 2024によると、毎日1500万以上のマージが実行されています。Mergeは協調作業の重要なメカニズムであり、複数の開発者の作業を単一の製品に統合することを可能にします。

重要ポイント

  • マージする — 2つのGitブランチを結合し、変更を統合すること
  • Merge commit — マージ結果を記録する新しいコミット
  • 戦略 — シナリオに応じたmerge、rebase、squash merge
  • コンフリクト — 両方のブランチで同じ行が変更された場合に発生
  • ベストプラクティス — コードレビュー後のPull Requestによるマージ

Gitのマージとは

Gitのマージは、2つ以上の開発履歴を1つに結合する操作です。開発者がブランチをマージすると、Gitは自動的に共通の祖先(ベースコミット)を見つけ、両方のブランチからの変更を含む新しいマージコミットを作成します。Three-way mergeは、共通の祖先、最初のブランチ、2番目のブランチの3つの状態を比較する標準アルゴリズムです。

マージプロセスはgit mergeコマンドで開始されます。Gitはブランチの分岐点を特定し、ソースブランチからターゲットブランチに順次変更を適用します。変更が競合しない場合、Gitは設定に応じてfast-forwardを実行するか、マージコミットを作成します。Fast-forwardは、ターゲットブランチがソースブランチのコミットに単純に移動するシナリオです。

bash
# ターゲットブランチに切り替えてマージ
git checkout main
git merge feature/payment-module

# 明示的なno-fast-forwardでマージ
git merge --no-ff feature/payment-module

# コンフリクトが複雑すぎる場合はマージを中止
git merge --abort

--no-ffフラグ(no fast-forward)は、fast-forwardが可能な場合でもマージコミットの作成を強制します。これにより、変更が別のブランチで行われたという情報が保持されます。多くのチームは、ブランチ履歴を明示的に維持するためにこのアプローチを好みます。

ブランチ統合の方法

Gitには3つの主要なブランチ統合戦略があり、それぞれ特定のシナリオに適しています。戦略の選択は、チームの文化とプロジェクト履歴の明確さの要件によって異なります。

戦略結果使用するタイミング
Standard mergeマージコミット + 完全な履歴完全な履歴を重視するチーム
Squash merge1つのコミット、履歴を圧縮多数の小さなコミットがあるフィーチャーブランチ
Rebase merge線形履歴、マージコミットなし個人のフィーチャーブランチ、PR作成前

Standard mergeは2つの親を持つマージコミットを作成します。完全な履歴は保持されますが、ブランチのグラフはより複雑になります。Squash mergeはフィーチャーブランチのすべてのコミットを1つにまとめ、ターゲットブランチの上に適用します。履歴は線形で明確になりますが、中間段階の情報は失われます。

Rebaseは完全なマージではありませんが、同じ結果を達成します。あるブランチの変更が別のブランチの上に移動されます。違いは、履歴が書き換えられることです。フィーチャーブランチのコミットは、ターゲットブランチの最新コミットの上に再作成されます。これにより完全に線形な履歴が得られますが、プッシュ時にforce pushが必要です。

マージコンフリクトの解決方法

マージコンフリクトは、ファイルの同じ行が2つのブランチで変更された場合に発生します。Gitは自動的にどちらのバージョンを保持するかを判断できず、開発者の介入が必要です。コンフリクトは、<<<<<<<、=======、>>>>>>>の特別なマーカーを使用してファイルに表示されます。

コンフリクト解決プロセスにはいくつかの手順が含まれます。まず、開発者は競合するファイルを開き、必要な変更を手動で選択します。単に1つのバージョンを選ぶだけでなく、両方の変更のロジックを理解し、正しい決定を下すことが重要です。ファイルを編集した後、コンフリクトマーカーを削除し、git addでステージングエリアに変更を追加します。

bash
# 競合ファイルの一覧を表示
git status

# mergetoolを起動(例:VS Code、IntelliJ)
git mergetool

# すべてのコンフリクトを解決した後
git add .
git merge --continue

# またはマージを完全に中止
git merge --abort

ビジュアルマージツールを使用すると、コンフリクト解決が大幅に高速化されます。VS Code、IntelliJ IDEA、GitKrakenは、現在のブランチ、 incoming ブランチ、結果の3つのパネルを備えたインターフェースを提供します。git mergetoolツールは、競合するファイルごとに設定されたエディターを自動的に開きます。

複雑なコンフリクトを回避する最善の方法は、フィーチャーブランチをメインブランチと定期的に同期することです。開発者が1日に1回mainを自分のブランチにマージすれば、コンフリクトは小さく簡単に解決できます。1週間変更を蓄積すると、エラーのリスクが高い複雑なコンフリクトが発生します。

mergeの代わりにrebaseを使用するタイミング

Rebaseとmergeは変更を統合する2つの方法であり、その選択はチーム内でしばしば議論を引き起こします。Rebaseは履歴を書き換えながら、あるブランチのコミットを別のブランチの上に移動します。Mergeはブランチ履歴を保持しながら、新しいマージコミットを作成します。各アプローチには長所と制限があります。

Rebaseは、開発者がローカルのフィーチャーブランチで作業しており、Pull Requestを作成する前にクリーンな線形履歴を必要とする場合に適しています。Rebase後、すべてのコミットは不要なマージコミットなしに順番に並べられます。ただし、rebaseにはforce pushが必要であり、複数の人が同時に作業するブランチには適用できません。

  • Rebase — クリーンな履歴が必要な個人のフィーチャーブランチ向け
  • Merge — 共有ブランチとマージ時点の記録向け
  • Squash — フィーチャーブランチに多数の小さなドラフトコミットがある場合

Gitの黄金律:既に共有リポジトリにプッシュされたコミットではrebaseを使用しないこと。これにより、共有ブランチの履歴が変更されず、他の開発者が重複したコミットや失われたコミットに遭遇しないことが保証されます。フィーチャーブランチをメインブランチに統合するには、Pull Requestを介したmergeを使用してください。

ブランチ統合のベストプラクティス

適切なマージプロセスは安定した開発の基盤です。現代のチームワークでは、マージはコンソールではなく、GitHubのPull RequestまたはGitLabのMerge Requestを介して行われます。PRはコードレビュー、自動CIチェックを通過し、その後初めてメインブランチにマージされます。

最初のプラクティス — すべてのチェックに合格した後にのみマージすること。CIパイプラインはプロジェクトをビルドし、テストを実行し、コード品質を検証する必要があります。少なくとも1つのチェックが失敗した場合、マージはブロックされます。最新のプラットフォーム(GitHub、GitLab)には組み込みの保護機能があります。ブランチプロテクションルールは、CIが失敗した場合に自動的にマージをブロックします。

2番目のプラクティス — 壊れたコードを決してマージしないこと。マージ前に、開発者は自分の変更がビルドを壊したり、既存の機能を退行させたりしないことを確認する必要があります。このために、自動テストとコードレビューが存在します。

3番目のプラクティス — マージ後にフィーチャーブランチをクリーンアップすること。マージ済みのブランチは削除する必要があります。これにより、混乱やリポジトリの乱雑さを防ぎます。GitHubはPRマージ後に自動的にブランチ削除を提案し、リポジトリ設定で自動削除を構成できます。

よくある質問

Gitのマージとは何ですか?

マージ(merge)は、2つのGitブランチを1つに結合することです。あるブランチの変更は、スリーウェイマージ(three-way merge)を介して別のブランチに転送されます。結果は、2つの親コミットを持つ新しいマージコミットに記録されます。Merge commitは、どのブランチがマージされたかに関する情報を保持します。

mergeとrebaseの違いは何ですか?

Mergeは新しいマージコミットを作成し、ブランチ履歴を保持します。Rebaseはマージコミットを作成せずにコミットを別のブランチの上に移動して履歴を書き換えます。Rebaseは線形履歴を提供しますが、force pushが必要です。Mergeは共有ブランチに対してより安全で、rebaseは個人ブランチに適しています。

マージコンフリクトを解決するには?

競合するファイルを開き、<<<<<<<、=======、>>>>>>>のマーカーを見つけ、必要な変更を選択してマーカーを削除します。git addでファイルを追加し、git merge --continueでマージを完了します。git mergetoolを使用して、VS CodeやIntelliJ IDEAでビジュアル解決を行います。

Pull Requestを介したマージはいつ行うべきですか?

Pull Request(またはMerge Request)は、フィーチャーブランチをプロジェクトのメインブランチにマージする際に必須です。PRは同僚によるコードレビューと自動CIチェックを通過します。これは現代の開発の標準です。ほとんどのプロジェクトでは、メインブランチへの直接プッシュは禁止されています。

squash mergeとは何で、いつ使うべきですか?

Squash mergeは、マージ前にフィーチャーブランチのすべてのコミットを1つにまとめます。これにより、中間のドラフトコミットがないクリーンなメインブランチ履歴が得られます。フィーチャーブランチに多数のユーティリティコミット(wip、fixes)が含まれており、履歴内のすべての中間ステップを保持する必要がない場合にsquash mergeを使用します。

まとめ

  • マージする — スリーウェイマージで2つのGitブランチを結合
  • Merge commit — 2つの親を持つコミット、ブランチ履歴を保持
  • 3つの戦略 — merge(完全な履歴)、squash(1コミット)、rebase(線形)
  • コンフリクト — git mergetoolまたは手動編集で解決
  • Pull Request — メインブランチへのマージ前の必須ステップ
  • 履歴の明確さ — 個人ブランチはrebase、共有ブランチはmerge
  • 予防 — フィーチャーブランチとmainの定期的な同期

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください