マージ競合を解決する

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

マージまたはリベースすると、あるブランチで行われた変更と別のブランチで行われた変更を統合するように Git に指示することになります。 多くの場合、Git は、サポートなしでマージまたはリベースを自動的に完了します。 ただし、あるブランチで行われた変更が別のブランチで行われたものと競合していることを Git が検出した場合は、競合を解決するように求めるメッセージが表示されます。 マージの競合は、マージされたブランチが同じファイル行を異なる方法で編集するとき、またはあるブランチがファイルを変更し、別のブランチがそれを削除したときに発生する可能性があります。 マージ競合を解決するプロセスは、Git のマージとリベースの両方に適用できます。

マージの競合の解決は、Visual Studio でも、コマンド ラインと任意のテキスト エディターを使用することでも可能です。

Git ワークフローの概要については、Azure Repos Git チュートリアル参照してください。

この記事では、次のタスクの手順を説明します。

  • マージの競合を理解する
  • マージ競合を解決する

マージの競合を理解する

Git のマージまたはリベースは、ソース ブランチからのコミットを現在のローカル ブランチ (ターゲット ブランチ) に統合します。 Git マージは、早送りまたは早送りなしのマージを実行します。 早送りなしのマージは、"3 方向" マージまたは "真の" マージとも呼ばれます。 Git リベース は別の種類のマージです。 これらのマージの種類を次の図に示します。

Git マージと Git リベースを使用するときのコミットの前後を示す図。

Git マージでは、ターゲット ブランチの先端がソース ブランチ内に存在する場合、既定のマージの種類は早送りマージになります。 それ以外の場合、既定のマージの種類は早送りなしマージになります。

早送りマージでマージの競合が発生する可能性はありません。ターゲット ブランチの先端がソース ブランチから外れた場合、Git は早送りマージを適用しないためです。 既定では、Git は可能な限り早送りマージを使用します。 たとえば、リモートの対応するブランチからプルすることによってのみ更新するローカル ブランチに、Git は早送りマージを適用します。

早送りなしマージは、ソース ブランチの変更とターゲット ブランチの変更を統合する新しいターゲット ブランチ "マージ コミット" を生成します。 対象になる変更は、両方のブランチに共通する最後のコミットの後に行われた変更です。 前の図では、コミット C が両方のブランチの最後の共通コミットです。 いずれかのソース ブランチの変更がいずれかのターゲット ブランチの変更と競合する場合、Git はマージの競合を解決するように求めるメッセージを表示します。 マージ コミット (L) には、ソース ブランチとターゲット ブランチの変更を統合したものが含まれています。 ソース ブランチとターゲット ブランチの先端 (K と E) がマージ コミットの親です。 ブランチのコミット履歴では、マージ コミットはマージ操作に役立つマーカーであり、どのブランチがマージされたかを明確に示します。

Git リベースは、ターゲット ブランチのコミット履歴を再度シーケンス処理して、最後の共通コミット以降のすべてのソース ブランチ コミットを、それに続いてすべてのターゲット ブランチ コミットを格納します。 前の図では、コミット C が両方のブランチの最後の共通コミットです。 これについて別の見方をすると、リベースはソース ブランチの履歴に対してターゲット ブランチの変更を再現します。 いずれかのソース ブランチの変更がいずれかのターゲット ブランチの変更と競合する場合、Git はマージの競合を解決するように求めるメッセージを表示します。 早送りマージと同様に、リベースはマージ コミットを作成しません。 注目点として、リベースは、既存のターゲット ブランチ コミットのシーケンスを変更します。これは、他のマージ方法では起こりません。 前の図では、コミット K' には K と同じ変更が含まれていますが、C ではなくコミット E がリンク元であるため、新しいコミット ID を持ちます。

Git のマージとリベースはターゲット ブランチのみを変更します。ソース ブランチは変更されないままです。 1 つ以上のマージ競合が発生すると、マージまたはリベースを完了するにはそれらを解決する必要があります。 または、マージ/リベース操作を取り消して、ターゲット ブランチを以前の状態に戻すことができます。

マージ オプションと方法の詳細については、 Git リファレンス マニュアルGit マージ方法に関するページを参照してください。

マージ競合を解決するとき

Git マージと Git リベースは、Git ワークフローで広く使用されています。 ローカルの機能またはバグ修正ブランチで作業するときは、次の方法が一般的です。

  1. リモート コミットのフェッチとマージを定期的にプルして、ローカルの main ブランチをリモートの対応するものと同じ状態に保ちます。
  2. リベースまたはマージを使用して、ローカルの main ブランチの更新内容をローカルの機能ブランチに統合します。
  3. ローカルの機能ブランチの作業を対応するリモート ブランチにプッシュして、バックアップします。
  4. 機能の完了時に、リモートの機能ブランチをリモートの main ブランチにマージする pull request を作成します。

リモートの変更内容をローカル リポジトリに頻繁に統合することで、他のユーザーによる最近の作業を常に把握し、発生するマージ競合を迅速に解決できます。

マージ競合を解決する

マージ競合を解決するプロセスは、Git マージと Git リベースの両方に適用できます。 次の手順では、マージ中のマージ競合を解決する方法について説明しますが、リベース中のマージ競合も同様に解決できます。

ヒント

ソース ブランチがリモート追跡ブランチの場合は、マージの前に Git フェッチを実行してブランチが最新になるようにします。 または、Git フェッチと Git マージを組み合わせた Git プル コマンドを実行します。

Visual Studio 2022 は、[Git] メニュー、[Git 変更]、および [ソリューション エクスプローラー] のコンテキスト メニューを使用して、Git バージョン管理エクスペリエンスを提供します。 Visual Studio 2019 バージョン 16.8 には、チーム エクスプローラーの Git ユーザー インターフェイスも用意されています。 詳細については、「Visual Studio 2019 - チーム エクスプローラー」タブを参照してください。

  1. [Git リポジトリ] ウィンドウの [ブランチ] ペインで、ターゲット ブランチをチェックアウトします。 次に、ソース ブランチを右クリックし、[<source-branch> を <target-branch> にマージする] を選択します。

    Visual Studio の [Git リポジトリ] ウィンドウのブランチ コンテキスト メニューにある [マージ] オプションのスクリーンショット。

  2. 競合が原因で Git がマージを停止した場合、Visual Studio から通知されます。 その場合は、競合を解決するか、マージを取り消してマージ前の状態に戻すことができます。 [Git 変更] ウィンドウの [マージされていない変更] セクションに、マージの競合があるファイルが一覧表示されます。 内容にマージ競合があるファイルについて、ファイルをダブルクリックしてマージ エディターで開きます。

    Visual Studio の [Git 変更] ウィンドウのマージ競合があるファイルのスクリーンショット。

  3. マージ エディターの [着信] ペインにソース ブランチ ファイルのバージョンが、[現在] ペインにターゲット ブランチ ファイルのバージョンが、[結果] ペインに結果のマージ ファイルが表示されます。 特定のソースまたはターゲット ブランチの変更内容を適用するには、維持する競合行の横にあるチェックボックスをオンにします。 [結果] ペインでマージ ファイルを直接編集することもできます。 現在のファイル内のすべてのマージ競合を解決したら、[マージの許可] を選択します。 内容の競合があるファイルごとに、この手順を繰り返します。

    Visual Studio のマージ エディターのスクリーンショット。

  4. あるブランチで編集され、もう一方のブランチで削除されたファイルについて、ファイルを右クリックして、目的のブランチ アクションを選択します。

    Visual Studio の [Git 変更] ウィンドウの競合ファイルに対するコンテキスト メニューのスクリーンショット。

  5. すべてのファイルのすべてのマージ競合を解決したら、[Git 変更] ウィンドウで、コミット メッセージを入力し、[ステージング済みをコミット] を選択してマージを完了します。

    Visual Studio の [Git 変更] ウィンドウのコミット メッセージと [ステージング済みをコミット] ボタンのスクリーンショット。

次のステップ