マージ競合の理解と解決
このトピックでは、Gitで自動的に解決できないマージ競合を理解して解決するために必要な知識について説明します。
マージ競合とは
マージ競合は、2つの異なるブランチのコミット間で競合するコード変更の解決方法をGitで自動的に決定できない場合に発生します。マージ競合は手動で解決する必要があります。
Gitでは、マージとは、ユーザーが異なるブランチのコミットを結合することです。ほとんどの場合、Gitでは、Gitペインのマージで指定したマージ戦略を使用して、2つのコミット間の相違点を解決します。ただし、ユーザーが同じコード行を異なる方法で更新した場合など、Gitはどのコード変更が正しいのかわからない場合があります。このような状況では、マージ競合が発生します。保持するコード変更と破棄するコード変更をGitに指示することで手動でマージ競合を解決します。
マージ競合を手動で解決した後、変更をリポジトリに正常にコミットできます。
マージ・エディタについて
マージ・エディタを使用して、選択したファイル内のマージ競合を特定、理解および解決します。マージ・エディタは、コマンドラインGitインタフェースからアクセスできるGit機能と同じ機能を提供します。
次に、マージ・エディタの各機能とその使用方法について説明します:
-
「マージ」タブ
「マージ」タブには、作業中のブランチのドロップダウン・リストと、ほとんどのマージ競合を解決するためにGitで使用するマージ戦略が表示されます。「Gitのマージ戦略の変更」を参照してください。セマンティック・モデルは多数のSMMファイルで構成されており、Gitで解決できないマージ競合は、「競合のマージ」ペインにファイル名別にリストされます。
「マージ」タブを使用して、Gitで解決できなかったすべてのマージ競合を取り消すことができます。「すべてのマージ競合の取消」を参照してください。
-
ブランチ・ペイン
ブランチ・ペインでは、ブランチAとブランチBの間の競合が強調表示されます。
- ブランチA - この領域では、マージ元のブランチであるソース(Theirs)ブランチの競合するコードが強調表示されます。
- ブランチB - この領域では、マージ先のブランチであるターゲット(Ours)ブランチの競合するコードが強調表示されます。
いずれかのペインをスクロールして、強調表示された競合を見つけて確認し、その解決方法を決定します。ブランチの「すべて取得」ボタンをクリックし、「出力」ペインに移動し、「すべて解決」をクリックしてこのブランチを真のソースとして使用して、すべての競合を解決できます。「すべて解決」ボタンの詳細は、次の「出力ペイン」の項を参照してください。
-
「出力」ペイン
「出力」ペインには、競合するコードが積み上げられて強調表示されるため、競合の解決に使用するコードを比較して選択できます。強調色は、ブランチ・ペインに表示されるブランチA (Theirs)およびB (Ours)に対応しています。
「競合」の上下ボタンを使用して、強調表示された競合を見つけて確認します。
この項では、マージ競合の解決に使用するボタンについて説明します。
-
「A」ボタンと「B」ボタン
「A」および「B」トグル・ボタンの選択解除と選択の方法は、競合の解決方法によって異なります。個々の競合を解決するには、「A」または「B」を選択するか、順序を指定してコード順序の競合の順序変更を行います(たとえば、ブランチBのコードは、ブランチAのコードの前に配置する必要があるなど)。「競合の解決方法の理解」を参照してください。
-
「アイテムの解決」ボタン
競合を1つずつ解決するには、このボタンを使用します。「A」ボタンまたは「B」ボタンを使用して強調表示された競合の解決方法を指定した後、「アイテムの解決」をクリックして、アイテムを解決済としてマークします。「アイテムの解決」をクリックすると、「出力」ペインは次の競合に移動します。「個々のマージ競合の解決」を参照してください。
-
「すべて解決」ボタン
このボタンは次の方法で使用できます:
「出力」ペインで、「A」ボタンおよび「B」ボタンを使用して各競合の解決方法に移動して指定し、「すべて解決」をクリックしてすべての競合を解決します。
「ブランチ」ペインで、「A」(Ours)または「B」(Theirs)の「ブランチ」ペインの「すべて取得」ボタンをクリックし、「すべて解決」をクリックして、選択したブランチを使用してすべての競合を解決します。「すべてのマージ競合の解決」を参照してください。
-
競合の解決方法の理解
このトピックでは、マージ・エディタのボタンを使用して、ファイルのマージ競合を1つずつまたはすべて同時に解決する方法について説明します。
「マージ・エディタについて」を参照してください。
個々の競合の解決
「出力」ペインで、「A」ボタンおよび「B」ボタンを使用して、マージ競合を1つずつ解決する方法を指定します。
競合の解決に使用するブランチに対応するボタンが強調表示されていることを確認します。デフォルトでは「A」と「B」の両方が選択されているため、「A」を選択するには、「B」の選択を解除する必要があります。
「A」ボタンおよび「B」ボタンを設定して競合の解決方法を指定したら、「アイテムの解決」ボタンをクリックして問題を解決し、次の競合に移動します。
個々の競合を解決するためのコード変更の順序変更
「出力」ペインで、「A」ボタンおよび「B」ボタンを使用して、競合を解決するためにコード変更の順序変更を行います。
コード変更の順序変更(または積上げ)が必要な競合の順序を選択します。順序を指定するには、「A」ボタンをクリックしてから、「B」ボタンをクリックして選択を解除します。次に、Bの前にA (Bのコードの前にAのコード)またはAの前にB (Aのコードの前にBのコード)の順序のボタンをクリックして、変更を積み上げる方法を指定します。次に、「アイテムの解決」ボタンをクリックして問題を解決し、次の競合に移動します。
すべての競合を同時に解決
ノート:
「すべて解決」ボタンを「出力」ペインの「A」ボタンおよび「B」ボタンとともに使用して、すべての競合を同時に解決することはできません。「ブランチ」ペインで、すべての競合を解決するために唯一の真のソースとして使用する「A」(Ours)ブランチまたは「B」(Theirs)ブランチの「すべて取得」ボタンをクリックし、「すべて解決」をクリックします。
個々の競合をマークし、すべての競合をマーク済として解決
「出力」ペインで、「競合」の上下ボタンを使用して、強調表示された各競合に移動し、「A」ボタンおよび「B」ボタンを使用して、強調表示された各競合の解決方法を指定します。各アイテムの解決方法を指定した後、「すべて解決」をクリックしてすべての競合を解決します。
Gitのマージ戦略の変更
ブランチ内で検出されたマージ競合をGitで自動的に解決する方法を選択できます。ほとんどの場合、Gitではマージ戦略を使用してブランチ間の相違点を解決できます。
次のGitのマージ戦略から選択できます:
セマンティック・マージ - セマンティック・モデラーのマージ戦略を使用するには、このオプションを使用します。セマンティック・マージは、テキストのみでなくモデルのオブジェクトをマージします。このマージ戦略を使用することをお薦めします。
Gitのマージ - Gitのデフォルトのマージ戦略を使用するには、このオプションを使用します。Gitのデフォルトのマージ戦略では、3方向アルゴリズムが使用されます。共通祖先が複数ある場合、Gitでは共通祖先のマージされたツリーを作成し、それを使用して3方向マージを決定します。
Ours - マージ先のブランチのコード変更を優先してGitで競合を解決するには、このオプションを使用します。これはブランチB (ターゲット・ブランチ)です。このオプションを選択すると、Gitではすべてのマージ競合の解決に「Ours」を使用しませんが、特定の競合の解決にデフォルトのマージ戦略を使用できない場合にのみ使用します。
Theirs - マージ元のブランチのコードを優先して競合を解決するには、このオプションを使用します。これはブランチA (ソース・ブランチ)です。このオプションを選択すると、Gitではすべてのマージ競合の解決に「Theirs」を使用しませんが、特定の競合の解決にデフォルトのマージ戦略を使用できない場合にのみ使用します。
Gitでマージ競合を自動的に解決できない場合は、「競合のマージ」ペインが表示され、手動で解決する必要がある競合がリストされます。「すべてのマージ競合の解決」および「個々のマージ競合の解決」を参照してください。
- ホーム・ページで、「ナビゲータ」、「セマンティック・モデル」の順にクリックします。
- 「セマンティック・モデル」ページで、セマンティック・モデルをクリックして開きます。
- 「Gitパネルの切替え」をクリックして、「Git」ペインを開きます。
- 「マージ」タブをクリックし、「戦略」フィールドに移動して、ブランチをマージするときに使用するマージ戦略を選択します。
- 「マージ」をクリックします。
すべてのマージ競合の取消
マージ・プロセスを取り消し、ブランチのマージ前状態を再構築できます。
マージの開始時にセマンティック・モデルにコミットされていない変更が含まれていた場合、Gitではマージ前の変更を再構築できない可能性があります。
- ホーム・ページで、「ナビゲータ」、「セマンティック・モデル」の順にクリックします。
- 「セマンティック・モデル」ページで、セマンティック・モデルをクリックして開きます。
- 「Gitパネルの切替え」をクリックして、「Git」ペインを開きます。
- 「マージ」タブをクリックし、「競合のマージ」ペインに移動します。
- 「すべて取消」をクリックします。
すべてのマージ競合の解決
選択したファイル内のすべてのマージ競合を解決するには、1つのブランチを真のソースとして選択します。
ブランチ・ペインでは、ブランチAとブランチBの間の競合が強調表示されます。
- ブランチA - このペインでは、ソース・ブランチまたはマージ元のブランチであるTheirブランチの競合するコードが強調表示されます。
- ブランチB - このペインでは、ターゲット・ブランチまたはマージ先のブランチであるOursブランチの競合するコードが強調表示されます。
ノート:
すべての競合の解決は、「出力」ペインの「A」ボタンまたは「B」ボタンをクリックし、「すべて解決」ボタンをクリックしてもできません。マージ競合を解決しても、セマンティック・モデルの不整合は修正されません。整合性チェックを実行して、セマンティック・モデルの不整合を検出して修正する必要があります。
- ホーム・ページで、「ナビゲータ」、「セマンティック・モデル」の順にクリックします。
- 「セマンティック・モデル」ページで、セマンティック・モデルをクリックして開きます。
- 「Gitパネルの切替え」をクリックして、「Git」ペインを開きます。
- 「マージ」タブをクリックし、「競合のマージ」ペインに移動します。
- ファイルを右クリックし、「競合の表示」を選択します。
- ブランチ・ペインで、ファイル内のすべてのマージ競合の解決に使用するブランチに対応する「すべて取得」ボタンをクリックします。
- 「出力」ペインで、「すべて解決」をクリックします。
- 「競合のマージ」ペインに移動し、競合を含むファイルがリストから削除されたことを確認します。
- 「マージ」タブで、「マージ」をクリックします。
個々のマージ競合の解決
選択したファイルの各マージ競合を1つずつ確認して解決できます。
「出力」ペインには、競合するコードが並んで表示されて強調表示されるため、競合の解決に使用するコードを比較して選択できます。強調色は、ブランチ・ペインに表示されるブランチA (Theirs)およびB (Ours)に対応しています。
競合ごとに、「A」ボタンおよび「B」ボタンを使用して、強調表示された競合の解決に使用するブランチのコードを指定します。デフォルトでは両方のボタンが選択されているため、「A」を選択するには、「B」の選択を解除する必要があります。または、「A」ボタンおよび「B」ボタンを使用して、コード変更の順序(または積上げ)を指定します。「競合の解決方法の理解」を参照してください。
マージ競合を解決しても、セマンティック・モデルの不整合は修正されません。整合性チェックを実行して、セマンティック・モデルの不整合を検出して修正する必要があります。
- ホーム・ページで、「ナビゲータ」、「セマンティック・モデル」の順にクリックします。
- 「セマンティック・モデル」ページで、セマンティック・モデルをクリックして開きます。
- 「Gitパネルの切替え」をクリックして、「Git」ペインを開きます。
- 「マージ」タブをクリックし、「競合のマージ」ペインに移動します。
- ファイルを右クリックし、「競合の表示」を選択します。
- 「出力」ペインで、強調表示されたマージ競合を見つけます。
- 「A」ボタンおよび「B」ボタンを使用して、競合の解決方法を指定します。「アイテムの解決」をクリックします。
- 競合の下へナビゲートをクリックして、次のマージ競合を強調表示します。
- 「A」ボタンおよび「B」ボタンを使用して、競合の解決方法を指定します。「アイテムの解決」をクリックします。
- 各競合に移動して解決します。
- すべての競合を解決したら、「競合のマージ」ペインに移動し、競合を含むファイルがリストから削除されたことを確認します。
- 「マージ」タブで、「マージ」をクリックします。