Was ist “git diff – patience” für?

Wie unterscheidet sich der Gedulds-Algorithmus vom Standard- git diff Algorithmus und wann würde ich ihn verwenden wollen?

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

Geduld Diff konzentriert sich stattdessen auf die niederfrequenten High-Content-Linien, die als Marker oder Signaturen wichtiger Inhalte im Text dienen. Es ist immer noch ein LCS-basiertes Diff in seinem core, aber mit einem wichtigen Unterschied, da es nur die längste gemeinsame Subsequenz der Signaturzeilen berücksichtigt:

Finde alle Linien, die genau einmal auf beiden Seiten vorkommen, dann führe die längste gemeinsame Teilfolge auf diesen Linien aus und vergleiche sie.

Wann solltest du Geduldsunterschied benutzen ? Laut Bram ist Geduld diff für diese Situation gut:

Die wirklich schlimmen Fälle sind solche, bei denen zwei Versionen dramatisch auseinander gegangen sind und der Entwickler nicht darauf achtet, die Patchgrößen unter Kontrolle zu halten. Unter diesen Umständen kann ein diff-Algorithmus gelegentlich “fehlausgerichtet” werden, indem er lange Abschnitte von geschweiften Klammern zusammenfügt, aber er schließt die geschweiften Klammern von functionen in einer Version mit den geschweiften Klammern der nächsten späteren function in der anderen Version zusammen. Diese Situation ist sehr hässlich und kann zu einer völlig unbrauchbaren Konfliktdatei in der Situation führen, in der solche Dinge am kohärentesten dargestellt werden müssen.

Sie können es auch für Merges verwenden (funktionierte hier sehr gut für einige XML-Konflikte):

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

Der Geduld-Diff-Algorithmus ist ein langsamer 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 an 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 eine gute Diskussion der subjektiven Diff-Qualität hier , und Git 2.11 erforscht Diff-Heuristiken weiter .

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