次の方法で共有


マージ競合を解決する

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

Visual Studio 2019 |Visual Studio 2022

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

Visual Studio で、またはコマンド ラインと任意のテキスト エディターを使用して、マージの競合を解決できます。

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

[前提条件]

カテゴリ Requirements
プロジェクトへのアクセス権 プロジェクトのメンバー。
アクセス許可 - プライベート プロジェクトのコードを表示する: 少なくとも Basic アクセス。
- プライベート プロジェクトのコードを複製または投稿する: 共同作成者 セキュリティ グループのメンバー、またはプロジェクト内の対応するアクセス許可。
- ブランチまたはリポジトリのアクセス許可を設定する: ブランチまたはリポジトリの アクセス許可を管理 します。
- 既定のブランチを変更する: リポジトリ のポリシー のアクセス許可を編集します。
- リポジトリをインポートする: プロジェクト管理者 セキュリティ グループのメンバーまたは Git プロジェクト レベルの [リポジトリ の作成 ] アクセス許可が [許可] に設定されています。 詳細については、「 Git リポジトリのアクセス許可を設定する」を参照してください。
サービス リポジトリが有効になっています
ツール Optional. az repos コマンドを使用する: Azure DevOps CLI

パブリック プロジェクトでは、 利害関係者 アクセス権を持つユーザーは、コードの表示、複製、投稿など、Azure Repos へのフル アクセス権を持ちます。

カテゴリ Requirements
プロジェクトへのアクセス権 プロジェクトのメンバー。
アクセス許可 - コードの表示: 少なくとも 基本 アクセス。
- コードの複製または投稿: 共同作成者 セキュリティ グループのメンバー、またはプロジェクト内の対応するアクセス許可。
サービス リポジトリが有効になっています

マージの競合について

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

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

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

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

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

Git リベース では、ターゲット ブランチのコミット履歴が再シーケンスされるため、すべてのソース ブランチコミットが含まれ、最後の共通コミット以降のすべてのターゲットブランチコミットが格納されます。 上の図では、コミット C は両方のブランチの最後の共通コミットです。 これを表示するもう 1 つの方法は、ソース ブランチ履歴の上にターゲット ブランチの変更をリベースで再生することです。 ソース ブランチの変更がターゲット ブランチの変更と競合する場合、Git によってマージの競合を解決するように求められます。 早送りマージと同様に、リベースではマージ コミットは作成されません。 特に、リベースによって既存のターゲット ブランチ コミットのシーケンスが変更されます。これは、他のマージ戦略の場合ではありません。 上の図では、コミット K' には K と同じ変更が含まれていますが、C ではなくコミット E にリンクするため、新しいコミット ID が含まれています。

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

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

マージの競合を解決するタイミング

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

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

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

マージ競合を解決する

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

ヒント

ソース ブランチが リモート追跡 ブランチの場合は、マージの前に Git フェッチ を実行して、ブランチが -date up-toされていることを確認します。 または、Git フェッチと Git マージを組み合わせた Git pull コマンドを実行します。

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

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

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

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

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

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

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

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

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

  5. [Git Changes]\(Git の変更\) ウィンドウで、コミット メッセージを入力し、[ Commit Staged]\(ステージングされたコミット \) を選択してマージを完了します。これは、すべてのファイルのすべてのマージ競合を解決した後です。

    Visual Studio の [Git Changes]\(Git の変更\) ウィンドウのコミット メッセージと [Commit Staged]\(ステージングされたコミット\) ボタンのスクリーンショット。

次のステップ