Angenommen, ich erhalte einen Patch mit git format-patch
. Die Datei ist im Grunde ein einheitlicher Diff mit einigen Metadaten. Wenn ich die Datei in Vim öffne, kann ich sehen, welche Zeilen geändert wurden, aber ich kann nicht sehen, welche Zeichen in den geänderten Zeilen unterschiedlich sind. Kennt jemand eine Möglichkeit (in Vim oder einer anderen kostenlosen Software, die unter Ubuntu ausgeführt wird), Unterschiede pro Zeichen zu visualisieren?
Ein Gegenbeispiel, bei dem Diff pro Zeichen visualisiert wird, ist die Ausführung vimdiff a b
.
Update Fr Nov 12 22:36:23 UTC 2010
diffpatch ist hilfreich für das Szenario, in dem Sie mit einer einzelnen Datei arbeiten.
Update Do 16. Juni 17:56:10 UTC 2016
Schauen Sie sich Diff-Highlight in Git 2.9 an . Dieses Skript macht genau das , wonach ich ursprünglich gesucht habe.
git diff --color-words
ist sehr nützlich, um zu sehen, welche Wörter sich innerhalb von Zeilen geändert haben, und nicht um die übliche einheitliche Diff-Ausgabe. Es ist jedoch eher wortbasiert als zeichenbasiert. Wenn der Inhalt, den Sie unterscheiden, nicht viel Leerzeichen enthält, ist die Ausgabe möglicherweise weniger ordentlich. (Bearbeitet: Ups, ich sehe, dass ich falsch verstanden habe, wonach Sie fragen - trotzdem wäre dieser Kommentar vielleicht für jemanden nützlich.)Antworten:
Angesichts Ihrer Verweise auf Vim in der Frage bin ich mir nicht sicher, ob dies die gewünschte Antwort ist :), aber Emacs kann dies tun. Öffnen Sie die Datei , die diff enthält, stellen Sie sicher , dass Sie in
diff-mode
(wenn die Datei mit dem Namen istfoo.diff
oderfoo.patch
geschieht dies automatisch, andernfalls geben M-xdiff-mode
RET), gehen Sie auf die Hunk Sie interessiert sind und treffen C-c C-bfürrefine-hunk
. Oder gehen Sie die Datei einzeln durch M-n; Dadurch wird die Verfeinerung automatisch durchgeführt.quelle
git log master.. -p | emacs -
M-!
, um den Befehl auszuführen und die Ausgabe in einem Puffer zu erfassen.In git können Sie ohne Commit zusammenführen. Führen Sie zuerst Ihren Patch zusammen und führen Sie dann Folgendes aus:
Beachten Sie den Punkt nach dem Gleichheitszeichen.
quelle
git diff --color-words=.
.git diff --color-words=.
undgit diff --color-words .
funktioniert anders. Besser istgit diff --color-words .
.git diff --color-words .
ist wirklich das gleiche wiegit diff --color-words -- .
! Das heißt, das.
wird als Pfad interpretiert. Sie können mit überprüfenmkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .
.Hier sind einige Versionen mit weniger verrauschten Ausgaben als
git diff --word-diff-regex=<re>
und, die weniger Eingabe erfordern als, aber äquivalent zugit diff --color-words --word-diff-regex=<re>
.Einfach (hebt Platzänderungen hervor):
Einfach (hebt einzelne Zeichenänderungen hervor; hebt keine Leerzeichenänderungen hervor):
Komplexer (hebt Raumänderungen hervor):
Allgemein:
wo
<re>
ein regulärer Ausdruck „Worte“ zum Zweck der Identifizierung von Veränderungen definieren.Diese sind insofern weniger laut, als sie die geänderten "Wörter" färben, wohingegen nur
--word-diff-regex=<re>
umgebende "Wörter" mit farbigen-/+
Markierungen umgeben sind.quelle
--color-words
, ohne das=.
Teil.git diff --color-words='\w'
würde besser mit Diakritika arbeiten (git v1.7.10.4)--word-diff=plain
, zusätzlich Löschungen und Surround-Ergänzungen zu haben[-
und zu-]
umgeben . Da das manuelle warnt, obwohl, tatsächliche Vorkommen dieser Trennzeichen in der Quelle nicht in irgendeiner Weise entkommen{+
+}
Der obige Regex ( von Thomas Rast ) trennt Diff-Fragmente auf Interpunktions- / Zeichenebene (obwohl er nicht so laut ist wie
--word-diff-regex=.
).Ich schrieb einen Screenshot der resultierenden Ausgabe hier .
Aktualisieren:
Dieser Artikel enthält einige großartige Vorschläge. Insbesondere verfügt der
contrib/
Baum des Git-Repo über eindiff-highlight
Perl-Skript, das feinkörnige Highlights anzeigt.Schnellstart zur Verwendung:
quelle
--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
'
am Anfang des Wertes hinzufügen . Ansonsten habe ich einen Fehler bekommen. Außerdem benutze ich einfach--color-words
das gleiche Verhalten wie bei der Verwendung dieses regulären Ausdrucks.foo.bar
, werdenfoo.qux
Sie den Unterschied sehen.git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
./usr/local/share/git-core/contrib/diff-highlight/diff-highlight
. Dies scheint darauf hinzudeuten, dass Homebrews Git den gesamten Beitrag in installiert/usr/local/share/git-core/contrib/
. Also schließlich funktionierte das Folgende für michgit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Wenn Sie nichts gegen die Installation von NodeJS haben, gibt es ein Paket namens "diff-so-fantasievoll" ( https://github.com/so-fancy/diff-so-fancy ), das sehr einfach zu installieren ist und perfekt funktioniert:
Edit: Habe gerade herausgefunden, dass es tatsächlich ein Wrapper für das offizielle Diff-Highlight ist ... Zumindest ist es für Perlophobe wie mich einfacher zu installieren und die GitHub-Seite ist gut dokumentiert :)
quelle
Ich kenne kein Werkzeug zur Unterscheidung von Zeichen pro Zeichen, aber es gibt ein Werkzeug zur Unterscheidung von Wörtern pro Wort: wdiff.
Siehe Beispiele Top 4 File Difference Tools unter UNIX / Linux - Diff, Colordiff, Wdiff, Vimdiff .
quelle
wdiff old_file new_file | cdiff
*vimdiff
, dann in vim:windo wincmd K
, um zum vertikalen Fensterlayout zu wechseln (untereinander) von nebeneinander. Dieses Layout ist viel besser für Dateien mit langen Zeilen.wdiff2
,mdiff
und das Online - Tool von Google .Nach ein wenig Recherche stelle ich fest, dass diese Frage kürzlich zweimal auf der Haupt-Mailingliste von Vim aufgetaucht ist. Das NrrwRgn-Plugin wurde beide Male erwähnt (machen Sie zwei enge Regionen und unterscheiden Sie sie). Die Verwendung von NrrwRgn, wie von Christian Brabandt beschrieben, ist eher eine Problemumgehung als eine Lösung, aber vielleicht ist das gut genug.
Ich habe NrrwRgn ausprobiert und es war zusammen mit: diffthis in der Tat nützlich, um Unterschiede pro Zeichen innerhalb von Teilen einer einzelnen Datei zu veranschaulichen. Aber es dauerte viele Tastenanschläge. Mein Vimscript ist ziemlich verrostet, aber es könnte wahrscheinlich ein Skript sein. Möglicherweise könnte NrrwRgn erweitert werden, um die gewünschte Funktionalität bereitzustellen.
Gedanken?
quelle