コンフリクトの解消
概要
同一のプロジェクトを異なるブランチで変更していた場合、ブランチをマージした際にコンフリクトが発生することがあります。
NDGitでは、プロジェクトファイルのコンフリクトの解消を支援する機能を提供しています。
モデルのコンフリクト
コンフリクト箇所毎に個別に解消する
適用する変更をコンフリクト箇所毎に個別に選択してコンフリクトを解消するには、次の手順で行います。
コンフリクト箇所毎の解消はEnterprise Editionで利用できます。
Professional Editionでは、後述するモデルファイル毎に一括で選択するでコンフリクトを解消してください。
- コンフリクトを解消したいファイルをマウスオーバーします。
- [コンフリクトの分析] ボタンをクリックすると、[コンフリクトの分析] ウィンドウが表示されます。
- ウィンドウ内で⛔アイコンをマウスホバーすると、コンフリクトのメッセージが表示されます。(メッセージの詳細はこちら)
- コンフリクトしている箇所を選択して、以下のいずれかの操作で優先する変更内容を選択します。
- マージしたブランチの変更を適用するには、[左を適用] ボタンをクリックします。
- 起点のブランチの変更を適用するには、[右を適用] ボタンをクリックします。
- 全てのコンフリクトを解消したら、[保存して閉じる] ボタンをクリックして変更内容を確定させます。
- [適用の取り消し] ボタンをクリックすることで、適用した変更を取り消すことができます。
- フィールド値が文字列の場合、[テキストをマージ] ボタンをクリックすることで、相手側、自分側の変更をテキストマージした内容を変更後として適用することができます。
- [ナビゲータで選択] ボタンをクリックすると、[コンフリクトの分析] ウィンドウで選択中のモデルの変化点を Next Design のエディタ上で確認することができます。
モデルファイル毎に一括で解消する
適用する変更をモデルファイル毎に一括で選択してコンフリクトを解消するには、次の手順で行います。
- コンフリクトを解消したいファイルを選択して、コンテキストメニューを開きます。
- 以下のいずれかの操作で優先する変更内容を選択します。
- マージしたブランチの変更を適用するには、[相手の変更を適用する] ボタンをクリックします。
- 起点のブランチの変更を適用するには、[自分の変更を適用する] ボタンをクリックします。
プロファイルのコンフリクト
プロファイルのコンフリクトは、プロファイル全体で相手の変更か自分の変更のどちらかを選択してコンフリクトを解消します。
- プロファイルを選択して、コンテキストメニューを開きます。
- 以下のいずれかの操作で優先する変更内容を選択します。
- マージしたブランチの変更を適用するには、[相手の変更を適用する] ボタンをクリックします。
- 起点のブランチの変更を適用するには、[自分の変更を適用する] ボタンをクリックします。
コンフリクトのパターン一覧
ブランチをマージしたときに発生しうる全コンフリクトを示します。 また、それらのコンフリクトが発生する操作例および、解消方法を示します。
No. | カテゴリ | コンフリクトのメッセージ |
---|---|---|
1 | モデル共通 | 削除する要素の属性[属性名 ]を変更しています。 |
2 | モデル共通 | 属性[属性名 ]が相互編集されています。 |
3 | モデル共通 | 所有関連が循環しています。 |
4 | モデル共通 | モデル名 を所有する所有関連が複数あります。 |
5 | モデル(プロダクトライン) | 複数の条件式モデルが設定されています。 |
6 | モデル(シーケンス図) | シーケンス図が相互編集されています。 |
7 | プロファイル共通 | プロファイルが相互編集されています。 |
8 | モデルファイル | このファイルのコンフリクトは解消できません。 解消方法をマニュアルで確認し、不整合がない状態にしてから再度マージを実行してください。 コンフリクトを解消できない理由は以下が考えられます。 - 変更前に含まれる同名のファイルで異なるモデルを分割している - 変更前に含まれる同名のファイルでリネームしている - 異なるフォルダ配下の同名のファイルを同一フォルダに移動してマージしている |
9 | モデルファイル | 比較できる条件を満たさなかったため、このファイルの変更内容を表示できませんでした。 以下の場合が考えられます。 - 変更前に含まれる同名のファイルで異なるモデルを分割しています。 - ファイルのスキーマバージョンが変更されています。 - ファイルパスまたはファイル名が変更されています。 |
対処方法
- 削除する要素の属性[
属性名
]を変更しています。
属性名
]を変更しています。発生条件
片方のコミットでモデルを削除する一方、もう片方のコミットでそのモデルのフィールドを更新すると、コンフリクトが発生します。
対処方法
モデルの削除、またはモデルのフィールド変更のうち適用したい側の変更を選択します。
2.1. 属性[属性名
]が相互編集されています。
属性名
]が相互編集されています。発生条件
片方のコミットでモデルのフィールドを更新する一方、もう片方のコミットで同じフィールドを違う値に更新すると、コンフリクトが発生します。
対処方法
適用したい側のモデルのフィールド変更を選択します。
2.2. 属性[UnitPath
]が相互編集されています。
UnitPath
]が相互編集されています。発 生条件
異なるブランチで同じモデルファイルを別のフォルダに移動すると、コンフリクトが発生します。
対処方法
適用したい側のモデルファイルのUnitPathを選択します。
さらに、UnitPathを選択するだけでなく、モデルファイルの実体もコンフリクトが発生しているため、それも同じ側を適用してください。
適用しなかった側のモデルファイルは手動で削除する必要があります。
- 所有関連が循環しています。
発生条件
片方のコミットでモデルの親を変更する一方、もう片方のコミットで親子関係が逆になるように親を変更を追加すると、コンフリクトが発生します。
対処方法
モデルの所有関連が循環しないようにする必要があります。 所有関連が循環しないように適用方向を指定してください。
モデル名
を所有する所有関連が複数あります。
モデル名
を所有する所有関連が複数あります。発生条件
片方のコミットでモデルファイルのインポートによりモデルを追加する一方、もう片方のコミットで同じモデ ルファイルをインポートすると、コンフリクトが発生します。
インポートにより同じIDのモデルがそれぞれ追加されますが、親との所有関連が異なるためコンフリクトとなります。
対処方法
モデルの親要素は1つである必要があります。
適用したい所有関連1つのみが残るように指定してください。
- 複数の条件式モデルが設定されています。
発生条件
片方のコミットでモデルのフィーチャを割り当てる(=フィーチャ条件式を設定する)一方、もう片方のコミットでも同じモデルにフィーチャを割り当てると、コンフリクトが発生します。
対処方法
条件式モデルは1つしか設定することができません。
適用したい条件式モデル1つのみが残るように指定してください。
- シーケンス図が相互編集されています。
発生条件
片方のコミットでシーケンス図を更新する一方、もう片方のコミットでそのシーケンス図を更新すると、コンフリクトが発生します。
シーケンス図の場合、シーケン ス図内の異なる要素を更新してもコンフリクトとなります。
対処方法
差分の詳細は、リボンの[表示] > [差分をエディタで表示]から確認できます。
シーケンス図に関しては、シーケンス図全体として片方の変更を選択する必要があります。
インタラクションモデルに対し、適用したい側を選択します。
- プロファイルが相互編集されています。
発生条件
片方のコミットでプロファイルの情報を更新する一方、もう片方のコミットでその情報を更新するとコンフリクトが発生します。
対処方法
プロファイルのファイル単位で変更を採用する側を選択します。
選択しなかった側の変更は、コンフリクトの有無に関わらずマージされません。
- このファイルのコンフリクトは解消できません。
発生条件1:変更前に含まれる同名のファイルで異なるモデルを分割している
異なるモデルを選択し、モデルファイル分割で同じモデルファイル名にすると、コンフリクトが発生します。
対処方法
Git ナビゲータではコンフリクトを解消できません。
異なるモデルファイルが、同一パス、同一名称のモデルファイルとならないように、モデルファイル分割を見直してください。
発生条件2:変更前に含まれる同名のファイルでリネームしている
異なるモデルファイルを同名のモデルファイル名にリネームすると、コンフリクトが発生します。
例えば、以下の手順で操作した場合に、このコンフリクトが発生します。
- 片方のコミットでモデルファイルを更新する
- もう片方のコミットでそのモデルファイルを別フォルダへ移動する
- もう片方のコミットで移動したモデルファイルと同名でリネームする
対処方法
Git ナビゲータではコンフリクトを解消できません。
異なるモデルファイルが、同一パス、同一名称のモデルファイルとならないように、モデルファイル分割を見直してください。
発生条件3:異なるフォルダ配下の同名のファイルを同一フォルダに移動してマージしている
片方のコミットでモデルファイルを移動する一方、もう片方のコミットでそのモデルファイルと同名のモデルファイルを同一フォルダへ移動すると、コンフリクトが発生します。
対処方法
Git ナビゲータではコンフリクトを解消できません。
異なるモデルファイルが、同一パス、同一名称のモデルファイルとならないように、モデルファイル分割を見直してください。
- 比較できる条件を満たさなかったため、このファイルの変更内容を表示できませんでした。
発生条件
同じモデルファイルをキャメルケースのみ違う別名のモデルファイル名にリネームすると、コンフリクトが発生します。
- 「ユースケース.nmld」を、片方で「Useecase.nmdl」と変更する
- 「ユースケース.nmld」を、もう片方で「UseCase.nmdl」と変更する
対処方法
Git ナビゲータではコンフリクトを解消できません。
同じモデルファイルが、キャメルケースのみ違う別名のモデルファイル名とならないように、モデルファイル名を見直してください。