「git diff --patience」とは何ですか?


219

忍耐力アルゴリズムはデフォルトのアルゴリズムとどのように異なりますかgit diff、いつ使用したいですか?


1
たぶんそれは移動されたコードとはるかに遅くなる可能性のある変更された行と一致します
codymanix

Patience DiffのスタンドアロンスクリプトをBazaarから抽出しました。別のSOスレッドで見つけることができます。
TryPyPy 2011年

38
フォローアップの質問。忍耐の差分を使用すべきでないのはいつですか?
バルキ

4
また、--histogram「...忍耐アルゴリズムを拡張して、「低頻度の
Robert

回答:


183

忍耐diffアルゴリズムの作者であるBram Cohenからの投稿を読むことができますが、忍耐diffアルゴリズムを非常によく要約しているこのブログ投稿を見つけました。

代わりに、Patience Diffは、テキストの重要なコンテンツのマーカーまたはシグネチャとして機能する低周波数の高コンテンツ行にエネルギーを集中させます。それはまだコアではLCSベースの差分ですが、重要な違いがあります。これは、署名行の最も長い共通のサブシーケンスのみを考慮するためです。

両側で1回だけ発生するすべての行を検索し、それらの行で最も長い共通のサブシーケンスを実行して、それらを一致させます。

いつdiff を使うべきですか?Bram氏によると、忍耐力の差はこの状況に適しています。

本当に悪いケースは、2つのバージョンが大幅に分岐していて、開発者がパッチサイズを制御するように注意していないケースです。それらの状況下では、diffアルゴリズムは、中括弧の長いセクションに一致するという点で「不整合」になる場合がありますが、あるバージョンの関数の中括弧と他のバージョンの次の関数の中括弧との関連付けが必要になります。この状況は非常に醜く、最も一貫性のある形で提示する必要がある状況では、まったく使用できない競合ファイルが発生する可能性があります。


3
当面のXMLの経験では、通常のdiffとまったく同じ「悪い」結果が得られます。
stivlo

5
私はXMLとの忍耐の差ではるかにうまく運んできました。確かに、私が現在見ているdiffには、通常のdiffアルゴリズムで説明されている不整合の問題が正確にありますが、忍耐力のdiffでは絶対的に壮大に見えます。
me_and 2012

22
このブログには、プロセスのアニメーションGIFを含む、すばらしい説明があります。alfedenzo.livejournal.com
Quantum7

3
私はこのブログが非常に興味深いものであり、アルゴリズムの詳細へのさらなるリンクが付いた良い説明を提供している:fabiensanglard.net/git_code_review/diff.php誰かに役立つことを願っています
SathOkh

frobnitz / fib / factの差分は、gist.github.com / roryokane / 6f9061d3a60c1ba41237
George V. Reillyの

52

これをマージに使用することもできます(XMLの競合については、ここでは非常にうまく機能しています)。

git merge --strategy-option=patience ...

51
または経由git config --global diff.algorithm patience
東武

11
より短いでしょうgit merge -X patience
PythonNut 2015

42

忍耐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アルゴリズムには、いくつかの既知の病理学的ケースがあることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.