Wofür ist "Git Diff - Geduld"?


219

Wie unterscheidet sich der Geduld-Algorithmus vom Standard- git diffAlgorithmus und wann möchte ich ihn verwenden?


1
Vielleicht passt es zu verschobenem Code und modifizierten Zeilen, die viel langsamer sein können
Codymanix

Ich habe ein eigenständiges Skript für Patience Diff aus Bazaar extrahiert. Sie finden es in einem anderen SO-Thread .
TryPyPy

38
Eine Folgefrage. Wann sollte ich nicht Geduld diff verwenden?
Balki

4
Es gibt auch den --histogramParameter, der "... den Geduldalgorithmus
Robert

Antworten:


183

Sie können einen Beitrag von Bram Cohen , dem Autor des Geduld-Diff-Algorithmus, lesen , aber ich fand diesen Blog-Beitrag, um den Geduld-Diff-Algorithmus sehr gut zusammenzufassen:

Patience Diff konzentriert seine Energie stattdessen auf die niederfrequenten Zeilen mit hohem Inhalt, die als Marker oder Signaturen für wichtige Inhalte im Text dienen. Es ist immer noch ein LCS-basiertes Diff im Kern, aber mit einem wichtigen Unterschied, da es nur die längste gemeinsame Teilsequenz der Signaturzeilen berücksichtigt:

Suchen Sie alle Zeilen, die auf beiden Seiten genau einmal vorkommen, und führen Sie dann die längste gemeinsame Teilsequenz auf diesen Zeilen aus, wobei Sie sie aufeinander abstimmen.

Wann sollten Sie verwenden Geduld Unterschied? Laut Bram ist Geduldunterschied gut für diese Situation:

Die wirklich schlimmen Fälle sind solche, in denen zwei Versionen dramatisch voneinander abweichen und der Entwickler nicht darauf achtet, die Patchgrößen unter Kontrolle zu halten. Unter diesen Umständen kann ein Diff-Algorithmus gelegentlich insofern "falsch ausgerichtet" werden, als er lange Abschnitte von geschweiften Klammern miteinander verbindet, aber die lockigen Klammern von Funktionen in einer Version mit den geschweiften Klammern der nächsten späteren Funktion in der anderen Version korreliert. Diese Situation ist sehr hässlich und kann zu einer völlig unbrauchbaren Konfliktdatei führen, wenn solche Dinge am kohärentesten dargestellt werden müssen.


3
Nach meiner Erfahrung mit XML liefert es genau die gleichen "schlechten" Ergebnisse wie ein normaler Diff.
Stivlo

5
Ich hatte viel mehr Glück mit Geduld mit XML; Sicherlich hat der Diff, den ich gerade betrachte, genau das mit dem regulären Diff-Algorithmus beschriebene Problem der Fehlausrichtung, sieht aber mit Geduld-Diff absolut großartig aus.
me_and

22
Dieser Blog hat eine großartige Erklärung, einschließlich eines animierten Gifs des Prozesses: alfedenzo.livejournal.com/170301.html
Quantum7

3
Ich fand diesen Blog sehr interessant und lieferte eine gute Erklärung mit weiteren Links zu Algorithmusdetails: fabiensanglard.net/git_code_review/diff.php Ich hoffe, es wird jemandem nützlich sein
SathOkh

Das frobnitz / fib / fact diff kann unter gist.github.com/roryokane/6f9061d3a60c1ba41237
George V. Reilly

52

Sie können es auch für Zusammenführungen verwenden (hat hier bei einigen XML-Konflikten sehr gut funktioniert):

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

51
Oder übergit config --global diff.algorithm patience
Tobu

11
Kürzer wäre git merge -X patience.
PythonNut

42

Der Geduld-Diff-Algorithmus ist ein langsamerer Diff-Algorithmus, der in einigen Fällen bessere Ergebnisse zeigt.

Angenommen, Sie haben die folgende Datei in git eingecheckt:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Jetzt ordnen wir die Abschnitte neu und fügen eine neue Zeile hinzu:

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}

Der Standard-Diff-Algorithmus behauptet, dass sich die Abschnittsüberschriften geändert haben:

$ 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;
 }

Während Geduld diff ein Ergebnis zeigt, das wohl intuitiver ist:

$ 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;
+}

Es gibt hier eine gute Diskussion über die subjektive Diff-Qualität , und Git 2.11 untersucht die Diff-Heuristik weiter .

Beachten Sie, dass der Geduld-Diff-Algorithmus noch einige bekannte pathologische Fälle aufweist .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.