Wie unterscheidet sich der Geduld-Algorithmus vom Standard- git diff
Algorithmus und wann möchte ich ihn verwenden?
--histogram
Parameter, der "... den Geduldalgorithmus
Wie unterscheidet sich der Geduld-Algorithmus vom Standard- git diff
Algorithmus und wann möchte ich ihn verwenden?
--histogram
Parameter, der "... den Geduldalgorithmus
Antworten:
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.
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 .