Diff (oder Git Diff) erhalten, um eingefügte Hunks richtig anzuzeigen

7

Angenommen, ich habe zwei Dateien. Der erste hat den Inhalt:

line 1
foo
line 2

line 1
bar
line 2

Und der zweite hat einen neuen Abschnitt in der Mitte eingefügt, so sieht es aus:

line 1
foo
line 2

line 1
new text
line 2

line 1
bar
line 2

Wenn ich jetzt ein "diff -u" mache, bekomme ich folgende Ausgabe:

--- file1   2013-06-25 16:27:43.170231844 -0500
+++ file2   2013-06-25 16:27:59.218757056 -0500
@@ -1,7 +1,11 @@
line 1
foo
line 2

line 1
+new text
+line 2
+
+line 1
bar
line 2

Dies spiegelt nicht richtig wider, dass die mittlere Zeilengruppe eingefügt wurde. Stattdessen sieht es so aus, als ob die zweite Zeilengruppe geändert und am Ende eine neue hinzugefügt wurde (dies liegt daran, dass der Algorithmus in der ersten abweichenden Zeile beginnt).

Gibt es eine Möglichkeit, diff (entweder für sich oder mithilfe von git diff) zu erhalten, um stattdessen diese Ausgabe anzuzeigen?

--- file1   2013-06-25 16:27:43.170231844 -0500
+++ file2   2013-06-25 16:27:59.218757056 -0500
@@ -1,7 +1,11 @@
line 1
foo
line 2
+
+line 1
+new text
+line 2

line 1
bar
line 2

Dies ist meistens ein Problem beim Generieren eines Patches für eine Überprüfung, bei dem eine neue Funktion in eine Gruppe ähnlicher Funktionen eingefügt wird. Das Standardverhalten spiegelt nicht wider, was sich wirklich geändert hat.

Derek Pressnall
quelle
Versuchen Sie sdiff file1 file2vielleicht, dass dies das ist, wonach Sie suchen.
g4ur4v
@ g4ur4v, nicht ganz - das lässt es immer noch so aussehen, als ob ein Teil von Abschnitt 2 geändert und ein Teil von Abschnitt 3 hinzugefügt wurde - als in Wirklichkeit ein neuer Abschnitt zwischen den beiden anderen eingefügt wurde.
Derek Pressnall
"Neue Funktion wird in eine Gruppe ähnlicher Funktionen eingefügt" ist selbst ein bisschen nach Code riechend, außer auch, in einigen Sprachen zu häufig. Haben Sie versucht --unified 5oder größere Werte?
msw
@msw, ich stimme dem Code-Geruch im Allgemeinen zu - ich kann mich nicht erinnern, was dieser ursprüngliche Fall war. Mein letzter Fall war jedoch das Einfügen von Datensätzen in einen XML-Datenbankexport. In diesem Fall ähneln die neuen Datensätze häufig den umgebenden Datensätzen (fast identisch mit dem obigen Beispiel). Das Hinzufügen einer großen Zahl zum Flag --unified bietet nur mehr Kontext, ändert jedoch nichts an der Stelle, an der die "+" - Zeichen angezeigt werden.
Derek Pressnall
XML wiederholt sich stark. Ich habe keinen der Links gejagt, aber vielleicht könnte stackoverflow.com/questions/1871076/… nützlich sein. Ich dachte dann über den längsten gemeinsamen Subsequenzalgorithmus nach und erkannte, dass er notwendigerweise quellenunwissende Unterschiede erzeugen würde. Dies ergab msdn.microsoft.com/en-us/library/aa302294.aspx, das auf semantischer Ebene zu funktionieren scheint.
Msw

Antworten:

2

Git 2.9 wurde Anfang dieses Jahres veröffentlicht und enthielt die experimentelle Flagge --compaction-heuristicauf dem git diffBefehl:

In 2.9 hat die Diff-Engine von Git eine neue Heuristik gelernt: Sie versucht, Hunk-Grenzen bei Leerzeilen zu halten und den Hunk "nach oben" zu verschieben, wenn der Boden des Hunk mit dem Boden des vorhergehenden Kontexts übereinstimmt, bis wir eine Leerzeile treffen.

Ich glaube nicht, dass GitHub es für Unterschiede in der Web-Benutzeroberfläche für Pull-Anfragen und Vergleiche aktiviert hat, aber Sie können es lokal tun. Ich würde empfehlen, es in Verbindung mit zu verwenden, --word-diffwenn Sie diese Granularität benötigen.

Weitere Details finden Sie im GitHub-Blog: https://github.com/blog/2188-git-2-9-has-been-released

rink.attendant.6
quelle
Sieht nicht so aus, als ob diese Flagge mehr existiert, zumindest auf Git 2.20
Boris
1

Der Geduld-Diff-Algorithmus ( git diff --patience) liefert möglicherweise natürlichere Ergebnisse, wenn auch nicht in allen Fällen.

Chirlu
quelle
1
Dies führte in meinem obigen Beispiel immer noch zu den gleichen Ergebnissen. Ich weiß, dass es irgendwo eine Lösung gibt, da ich mich daran erinnere, dass ich vor einiger Zeit darüber gelesen habe und mich einfach nicht erinnern kann.
Derek Pressnall
0

In bestimmten Fällen kann der Befehl git diff --word-diff(oder --color-words) zu besser aussehenden Ergebnissen führen

Asenar
quelle