Wenn ich "git diff" eingebe, möchte ich ein Side-by-Side-Diff sehen, wie bei "diff -y", oder das Diff in einem interaktiven Diff-Tool wie "kdiff3" anzeigen. Wie kann das gemacht werden?
Wenn ich "git diff" eingebe, möchte ich ein Side-by-Side-Diff sehen, wie bei "diff -y", oder das Diff in einem interaktiven Diff-Tool wie "kdiff3" anzeigen. Wie kann das gemacht werden?
Antworten:
Obwohl Git eine interne Implementierung von diff hat, können Sie stattdessen ein externes Tool einrichten.
Es gibt zwei verschiedene Möglichkeiten, ein externes Diff-Tool anzugeben:
GIT_EXTERNAL_DIFF
und der GIT_DIFF_OPTS
Umgebungsvariablen.git config
Siehe auch:
git diff --help
Dabei git diff
überprüft Git sowohl die Einstellungen der oben genannten Umgebungsvariablen als auch deren .gitconfig
Datei.
Standardmäßig übergibt Git die folgenden sieben Argumente an das diff-Programm:
path old-file old-hex old-mode new-file new-hex new-mode
Normalerweise benötigen Sie nur die Parameter für alte und neue Dateien. Natürlich verwenden die meisten Diff-Tools nur zwei Dateinamen als Argument. Dies bedeutet, dass Sie ein kleines Wrapper-Skript schreiben müssen, das die Argumente, die Git für das Skript bereitstellt, übernimmt und an das externe Git-Programm Ihrer Wahl weitergibt.
Angenommen, Sie legen Ihr Wrapper-Skript unter ~/scripts/my_diff.sh
:
#!/bin/bash
# un-comment one diff tool you'd like to use
# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5"
# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"
# using Meld
/usr/bin/meld "$2" "$5"
# using VIM
# /usr/bin/vim -d "$2" "$5"
Sie müssen das Skript dann ausführbar machen:
chmod a+x ~/scripts/my_diff.sh
Sie müssen Git dann mitteilen, wie und wo Sie Ihr benutzerdefiniertes Diff-Wrapper-Skript finden. Sie haben drei Möglichkeiten, dies zu tun: (Ich bevorzuge das Bearbeiten der .gitconfig-Datei)
Verwenden von GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
zB in Ihrer .bashrc- oder .bash_profile-Datei können Sie Folgendes einstellen:
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
export GIT_EXTERNAL_DIFF
Verwenden von git config
Verwenden Sie "git config", um zu definieren, wo sich Ihr Wrapper-Skript befindet:
git config --global diff.external ~/scripts/my_diff.sh
Bearbeiten Sie Ihre ~/.gitconfig
Datei
Sie können Ihre ~/.gitconfig
Datei bearbeiten , um folgende Zeilen hinzuzufügen:
[diff]
external = ~/scripts/my_diff.sh
Hinweis:
Ähnlich wie bei der Installation Ihres benutzerdefinierten Diff-Tools können Sie auch ein benutzerdefiniertes Zusammenführungs-Tool installieren, das ein visuelles Zusammenführungswerkzeug sein kann, um die Visualisierung der Zusammenführung besser zu unterstützen. (siehe die progit.org Seite)
Siehe: http://fredpalma.com/518/visual-diff-and-merge-tool/ und https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
meld
?
meld
Version für ein Verzeichnisdiff konfiguriert werden, bei dem ich auswählen kann, für welche Datei (en) ich das Diff anzeigen möchte? Derzeit wird meld
für jede Datei ein separater Befehl ausgeführt, und ich muss beenden meld
, um die nächste Datei anzuzeigen. Ich hätte mir lieber meld
eine Verzeichnisliste der geänderten Dateien gezeigt, wie sie sich verhalten, wenn meld
sie von Mercurial verwendet werden.
Verwenden Sie git difftool
anstelle von git diff
. Du wirst niemals zurückkehren.
Hier ist ein Link zu einem anderen Stackoverflow, der Folgendes behandelt git difftool
: Wie kann ich die Ausgabe von 'git diff' mit meinem bevorzugten Diff-Tool / Viewer anzeigen?
Für neuere Versionen von git
unterstützt der difftool
Befehl viele sofort einsatzbereite externe Diff-Tools. Zum Beispiel vimdiff
wird automatisch unterstützt und kann über die Befehlszeile geöffnet werden durch:
cd /path/to/git/repo
git difftool --tool=vimdiff
Andere unterstützte externe Diff-Tools sind hier aufgelistet. git difftool --tool-help
Dies ist eine Beispielausgabe:
'git difftool --tool=<tool>' may be set to one of the following:
araxis
kompare
vimdiff
vimdiff2
The following tools are valid, but not currently available:
bc3
codecompare
deltawalker
diffuse
ecmerge
emerge
gvimdiff
gvimdiff2
kdiff3
meld
opendiff
tkdiff
xxdiff
This message is displayed because 'diff.tool' is not configured.
. Vielleicht aktualisieren Sie die Antwort mit minimaler Konfiguration dieses Dings, so dass nebeneinander Unterschiede im Terminal angezeigt werden. Was hat OP verlangt? GUI-Tools sind auf Remote-Servern, auf denen Sie eine Verbindung mit ssh herstellen, ziemlich nutzlos.
git difftool
bei vimdiff
der die beiden Dateien / Puffer nicht immer richtig ausgerichtet sind.
git difftool -y
, um tkdiff prompt zu verhindern
git difftool
in Windows & Linux verschmelzen : stackoverflow.com/a/48979939/4561887
Sie können es auch versuchen git diff --word-diff
. Es ist nicht gerade Seite an Seite, aber irgendwie besser, also ziehen Sie es vielleicht Ihrem tatsächlichen Bedarf an Seite an Seite vor.
git diff --word-diff=color
--word-diff=color
gibt mir einen ungültigen Optionsfehler. In welcher Version wurde es eingeführt?
git diff --color-words
funktioniert.
git diff --color-words
ist der Weg zu modernen Git-Versionen.
ydiff
Früher genannt cdiff
, kann dieses Tool nebeneinander , inkrementell und farbenfroh angezeigt werden.
Anstatt zu tun git diff
, tun Sie:
ydiff -s -w0
Dies wird ydiff
im Side-by-Side-Anzeigemodus für jede der Dateien mit Unterschieden gestartet .
Installieren mit:
python3 -m pip install --user ydiff
-oder-
brew install ydiff
Für git log
können Sie verwenden:
ydiff -ls -w0
-w0
Erkennt automatisch Ihre Terminalbreite. Weitere ydiff
Informationen und eine Demo finden Sie auf der GitHub-Repository-Seite .
Getestet in Git 2.18.0, ydiff 1.1.
git diff | cdiff -s
zu icdiff macht?
ydiff -s
von einem git / svn / hg-Arbeitsbereich aus, Sie müssen nicht
cd <git repo>
führen Sie ihn ausydiff -ls <path/to/file>
Sie können eine Seite-an-Seite zu tun diff
mit sdiff
wie folgt:
$ git difftool -y -x sdiff HEAD^ | less
Wo HEAD^
ist ein Beispiel, das Sie durch alles ersetzen sollten, gegen das Sie sich unterscheiden möchten.
Ich habe diese Lösung hier gefunden, wo es auch ein paar andere Vorschläge gibt. Diese eine Antwort ist jedoch die Frage des OP kurz und klar.
Eine Erklärung der Argumente finden Sie im man git-difftool .
Wenn Sie die Kommentare berücksichtigen, können Sie einen praktischen git sdiff
Befehl erstellen, indem Sie das folgende ausführbare Skript schreiben:
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
Speichern Sie es als /usr/bin/git-sdiff
und chmod -x
es. Dann können Sie Folgendes tun:
$ git sdiff HEAD^
tput cols
stattdessen zum Beispiel : git difftool -x "sdiff -s -w $(tput cols)"
.
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
dann einfach:
git diff
Wenn Sie in einem Browser nebeneinander Unterschiede sehen möchten , ohne GitHub einzubeziehen , könnte Ihnen git webdiff gefallen , ein Ersatz für git diff
:
$ pip install webdiff
$ git webdiff
Dies bietet eine Reihe von Vorteilen gegenüber herkömmlichen GUI-Difftools tkdiff
, da Sie damit Syntax hervorheben und Bildunterschiede anzeigen können.
Lesen Sie hier mehr darüber .
Ich benutze Colordiff .
Installieren Sie es unter Mac OS X mit
$ sudo port install colordiff
Unter Linux ist möglicherweise apt get install colordiff
oder so etwas, abhängig von Ihrer Distribution.
Dann:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
Oder erstellen Sie einen Alias
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
Dann können Sie es verwenden
$ git diffy HEAD^ HEAD
Ich habe es "diffy" genannt, weil diff -y
es das Side-by-Side-Diff in Unix ist. Colordiff fügt auch Farben hinzu, die schöner sind. In der Option -ydw
ist das y
für die Seite an Seite, das w
ist das Ignorieren von Leerzeichen und das d
ist das Erzeugen des minimalen Diff (normalerweise erhalten Sie ein besseres Ergebnis als Diff).
-y
, um die Launch 'colordiff' [Y/n]:
Eingabeaufforderung zu überspringen .
git alias diffy "difftool --extcmd=\"colordiff -ydw\""
? Sollte es nicht sein git config --global alias.diffy "difftool --extcmd=\"colordiff -ydw\""
?
Für Unix kombinieren Sie nur git
und das eingebaute diff
:
git show HEAD:path/to/file | diff -y - path/to/file
Natürlich können Sie HEAD durch eine andere Git-Referenz ersetzen, und Sie möchten wahrscheinlich -W 170
dem Befehl diff etwas Ähnliches hinzufügen .
Dies setzt voraus, dass Sie nur Ihren Verzeichnisinhalt mit einem früheren Commit vergleichen. Der Vergleich zwischen zwei Commits ist komplexer. Wenn Ihre Shell ist bash
, können Sie "Prozessersetzung" verwenden:
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
wo REF1
und REF2
sind Git-Referenzen - Tags, Zweige oder Hashes.
Ich persönlich mag icdiff sehr !
Wenn Sie auf Mac OS X
mit HomeBrew
, nur zu tun brew install icdiff
.
Um die Dateibeschriftungen und andere coole Funktionen korrekt zu erhalten, habe ich in meinem ~/.gitconfig
:
[pager]
difftool = true
[diff]
tool = icdiff
[difftool "icdiff"]
cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
Und ich benutze es wie: git difftool
Diese Frage tauchte auf, als ich nach einer schnellen Möglichkeit suchte, mithilfe der integrierten Git-Methode Unterschiede zu lokalisieren. Meine Lösungskriterien:
Ich habe diese Antwort gefunden , um Farbe in Git zu bekommen.
Um nebeneinander diff statt line diff zu erhalten, habe ich die ausgezeichnete Antwort von mb14 auf diese Frage mit den folgenden Parametern optimiert :
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"
Wenn Ihnen das zusätzliche [- oder {+ nicht gefällt, --word-diff=color
kann die Option verwendet werden.
$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color
Dies half beim richtigen Vergleich mit json- und xml-Text und Java-Code.
Zusammenfassend lässt sich sagen, dass die --word-diff-regex
Optionen zusammen mit den Farbeinstellungen eine hilfreiche Sichtbarkeit bieten, um beim Durchsuchen großer Dateien mit kleinen Zeilenänderungen ein farblich abgestimmtes Quellcodeerlebnis im Vergleich zum Standard-Zeilendifferenz zu erzielen.
Einige andere erwähnten bereits cdiff für Git Side-by-Side-Unterschiede, aber niemand gab eine vollständige Implementierung davon.
Setup cdiff:
git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s `pwd`/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
# or just create a new terminal
Bearbeiten Sie ~ / .gitconfig, indem Sie die folgenden Zeilen einfügen:
[pager]
diff = false
show = false
[diff]
tool = cdiff
external = "cdiff -s $2 $5 #"
[difftool "cdiff"]
cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"
[alias]
showw = show --ext-dif
Der Pager aus wird benötigt, damit cdiff mit Diff funktioniert. Es handelt sich im Wesentlichen um einen Pager, daher ist dies in Ordnung. Difftool funktioniert unabhängig von diesen Einstellungen.
Der Show-Alias wird benötigt, da git show nur externe Diff-Tools über Argumente unterstützt.
Das '#' am Ende des Befehls diff external ist wichtig. Der Diff-Befehl von Git hängt ein $ @ (alle verfügbaren Diff-Variablen) an den Diff-Befehl an, aber wir wollen nur die beiden Dateinamen. Also rufen wir diese beiden explizit mit $ 2 und $ 5 auf und verstecken dann das $ @ hinter einem Kommentar, der sdiff sonst verwirren würde. Daraus resultiert ein Fehler, der wie folgt aussieht:
fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.
Git-Befehle, die jetzt nebeneinander Unterschiede erzeugen:
git diff <SHA1> <SHA2>
git difftool <SHA1> <SHA2>
git showw <SHA>
Cdiff Verwendung:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
Sie haben jetzt Side-by-Side-Diff über Git Diff und Difftool. Und Sie haben den cdiff Python-Quellcode für die Anpassung von Hauptbenutzern, falls Sie ihn benötigen.
Hier ist ein Ansatz. Wenn Sie weniger durchpfeifen, wird die xterm-Breite auf 80 eingestellt, was nicht so heiß ist. Wenn Sie den Befehl jedoch mit z. B. COLS = 210 ausführen, können Sie Ihr erweitertes xterm verwenden.
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
Öffnen Sie Intellij IDEA , wählen Sie im Toolfenster "Versionskontrolle" ein oder mehrere Commits aus, durchsuchen Sie geänderte Dateien und doppelklicken Sie darauf, um die Änderungen für jede Datei nebeneinander zu überprüfen.
Mit dem mitgelieferten Befehlszeilen-Launcher können Sie IDEA mit einem einfachen Befehl überall aufrufen idea some/path
Es gibt viele gute Antworten auf diesen Thread. Meine Lösung für dieses Problem bestand darin, ein Skript zu schreiben.
Nennen Sie diesen 'git-scriptname' (und machen Sie ihn ausführbar und fügen Sie ihn wie jedes Skript in Ihren PATH ein), und Sie können ihn wie einen normalen git-Befehl aufrufen, indem Sie ihn ausführen
$ git scriptname
Die eigentliche Funktionalität ist nur die letzte Zeile. Hier ist die Quelle:
#!/usr/bin/env zsh
#
# Show a side-by-side diff of a particular file how it currently exists between:
# * the file system
# * in HEAD (latest committed changes)
function usage() {
cat <<-HERE
USAGE
$(basename $1) <file>
Show a side-by-side diff of a particular file between the current versions:
* on the file system (latest edited changes)
* in HEAD (latest committed changes)
HERE
}
if [[ $# = 0 ]]; then
usage $0
exit
fi
file=$1
diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R