GNU diff3(3方向マージ)は予期しない結果をもたらします
質問
ファイルとあなたのファイルが古い子孫であると仮定します。
file_mine =
abc def ghi
file_old =
abc jkl ghi
file_yours =
abc def ghi
指示 diff3 -m MIND OLD YOURS
与える:
abc <<<<<<< OLD jkl ======= def >>>>>>> YOURS ghi
diff3はその私のものを解決することができず、あなたのものは同じ変更を加えました。
なんで?そして、この問題を解決する方法はありますか?
これであなたの脳をくすぐる:
diff OLD MIND
と diff OLD YOURS
出力に同一の塊があります。
2c2 < jkl --- > def
これらの塊は、三者合併中に「キャンセル」してはいけませんか?
解決
何があると思っていましたか?
として diff3ユーティリティを説明する記事 言う:
...これ(マージ) 真実ではありません 3つの入力ファイルすべてが異なる場合 古いだけが異なる場合;これをaと呼びます 対立. 。 3つの入力ファイルがすべて異なる場合、競合をと呼びます オーバーラップ
したがって、あなたが説明したケースは紛争として扱われます。 'なぜそうなのか?'あなたは尋ねるかもしれません。 diff3アルゴリズムのため。説明あなたは同じページで見つけることができます:
これを(マージ)減算と考えることができます 古い から あなたの 結果を追加します 私の, 、または私のものに合流するように、あなたのものに変わる変化
変更が行われている適切なコンテキストがないため、違いを適切に解決することはできません。
他のアプローチを使用して動作するはずだと言ったら、私はあなたに同意します。しかし...それはそれが何であるかです。 diff3は完璧ではありません。で説明されているように、他のツールを使用したい場合は、他のツールを使用することをお勧めします。 記事