Wofür ist "Git Diff - Geduld"?

219

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

Gabe Moothart
quelle
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.

Mark Rushakoff
quelle
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 ...
robinst
quelle
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 .

Wilfred Hughes
quelle