Ist es möglich, eine eindeutige git diff zu erhalten, wenn eine Funktion vollständig ersetzt wird?

9

Ich bin also ein paar Mal auf dieses Problem gestoßen. Während einer Runde von Änderungen entferne ich functionA() und füge functionB() an derselben Stelle hinzu. Wenn ich diff starte, kommt es zu einem scheußlichen, verwirrenden Satz von Änderungen, bei dem versucht wird, die beiden Funktionen in ihren gemeinsamen Klammern zu vergleichen, anstatt alle functionA als Entfernung und alle functionB als Zusatz anzuzeigen . Für ein vereinfachtes Beispiel:

%Vor%

wurde durch

ersetzt %Vor%

das diff könnte

ergeben %Vor%

Was nutzlos und schwer zu lesen ist, da es neben den Klammern keine Gemeinsamkeiten gibt. Es werden sogar Klammern übersprungen, die sich nicht ausrichten, bis sie diejenigen findet, die das tun, was häufig genug ist. Und in einem Fall, den ich jetzt betrachte, entfernte ich 7 aufeinanderfolgende Funktionen und fügte 3 hinzu, die ungefähr dasselbe tun, eine viel leichter lesbare / wartbare Art und Weise. Der Diff-Algorithmus verteilt die Additionen verstreut durch alle 7 entfernten Funktionen, was ein unlesbares und verwirrendes Chaos verursacht.

Gibt es eine Möglichkeit, git diff zu optimieren, um Fälle zu ignorieren, in denen die einzige Gemeinsamkeit eine geschweifte Klammer ist?

Wenn es darauf ankommt, hat mein System derzeit git 1.9.0 und diff (GNU difftools) 2.8.1 Ich markierte C ++, weil das System, an dem ich arbeite, C ++ ist (meistens C-style), aber das sollte für eine Reihe anderer Sprachen gelten.

Bei der Suche nach vorhandenen Fragen war das nächste, das ich finden konnte, Was ist git diff --patience ? für? Dies hatte jedoch wenig Einfluss auf mein Diff. (Es ist anders, aber nicht sichtbar klarer)

Ich sehe auch in der git diff man-Seite die Option --break-rewrites, die das macht, was ich will, aber nur auf der Dateiebene, nicht auf der Funktionsebene.

Wenn nichts anderes, schätze ich, kann ich versuchen, in Zukunft eine neue Logik in einen völlig anderen Teil der Datei einzufügen, aus irgendwelchen Entfernungen, in Fällen, in denen das Diff die Addition in einem Block zeigen soll, aber ich würde es vorziehen, verwandte Logik zusammen zu halten.

    
Bryon 07.06.2016, 17:05
quelle

1 Antwort

1

Git zur Zeit 1 bietet vier Diff-Algorithmen, die als myers (Standard), minimal , patience und histogram bekannt sind. Der letzte ist eine kleine Änderung an patience . Diese waren alle in Git Version 1.9.0, obwohl. Wenn keiner von ihnen das tut, was Sie wollen, können Sie Git anweisen, ein externes diff zu verwenden. Siehe den Abschnitt "Diff-Text generieren" in der Dokumentation gitattributes (was auf die Hauptdokumentation verweist) für Details. Es ist ein wenig kompliziert, aber zusammenfassend verwenden Sie gitattributes , um Git zu zwingen, das externe diff-Programm auszuführen, und Sie definieren das externe diff-Programm, indem Sie ein Skript (normalerweise sh / bash) schreiben und konfigurieren es in Ihren globalen oder pro-Repository-Einstellungen.

1 Ab Version 2.8.x sowieso; 2.9 ist fast out und hat keine neuen.

    
torek 07.06.2016 18:48
quelle

Tags und Links