回答:
忍耐diffアルゴリズムの作者であるBram Cohenからの投稿を読むことができますが、忍耐diffアルゴリズムを非常によく要約しているこのブログ投稿を見つけました。
代わりに、Patience Diffは、テキストの重要なコンテンツのマーカーまたはシグネチャとして機能する低周波数の高コンテンツ行にエネルギーを集中させます。それはまだコアではLCSベースの差分ですが、重要な違いがあります。これは、署名行の最も長い共通のサブシーケンスのみを考慮するためです。
両側で1回だけ発生するすべての行を検索し、それらの行で最も長い共通のサブシーケンスを実行して、それらを一致させます。
いつdiff を使うべきですか?Bram氏によると、忍耐力の差はこの状況に適しています。
本当に悪いケースは、2つのバージョンが大幅に分岐していて、開発者がパッチサイズを制御するように注意していないケースです。それらの状況下では、diffアルゴリズムは、中括弧の長いセクションに一致するという点で「不整合」になる場合がありますが、あるバージョンの関数の中括弧と他のバージョンの次の関数の中括弧との関連付けが必要になります。この状況は非常に醜く、最も一貫性のある形で提示する必要がある状況では、まったく使用できない競合ファイルが発生する可能性があります。
これをマージに使用することもできます(XMLの競合については、ここでは非常にうまく機能しています)。
git merge --strategy-option=patience ...
git config --global diff.algorithm patience
git merge -X patience
。
忍耐diffアルゴリズムは、場合によってはより良い結果を示す低速のdiffアルゴリズムです。
次のファイルをgitにチェックインしたとします。
.foo1 {
margin: 0;
}
.bar {
margin: 0;
}
次に、セクションを並べ替えて、新しい行を追加します。
.bar {
margin: 0;
}
.foo1 {
margin: 0;
color: green;
}
デフォルトのdiffアルゴリズムは、セクションの見出しが変更されていると主張しています。
$ git diff --diff-algorithm=myers
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
margin: 0;
}
-.bar {
+.foo1 {
margin: 0;
+ color: green;
}
一方、patience diffは、おそらくより直感的な結果を示します。
$ git diff --diff-algorithm=patience
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
- margin: 0;
-}
-
.bar {
margin: 0;
}
+
+.foo1 {
+ margin: 0;
+ color: green;
+}
ここでは主観的なdiff品質についての良い議論があり、git 2.11はdiffヒューリスティックスをさらに調査しています。
忍耐diffアルゴリズムには、いくつかの既知の病理学的ケースがあることに注意してください。