829 Stimmen

Wie kann ich die "git diff"-Ausgabe mit meinem bevorzugten Diff-Tool/Viewer anzeigen?

Wenn ich tippe git diff Ich möchte die Ausgabe mit dem visuellen Diff-Tool meiner Wahl (SourceGear "diffmerge" unter Windows) anzeigen. Wie konfiguriere ich Git für diese Aufgabe?

120 Stimmen

In allen neueren Versionen von git können Sie "git difftool" statt "git diff" verwenden. Damit wird ein visuelles Diff-Programm geöffnet.

0 Stimmen

Bezüglich des neuen Skripts difftool habe ich unten eine Antwort hinzugefügt: stackoverflow.com/questions/255202/

2 Stimmen

Gitx - gitx.frim.nl . Das war's.

417voto

VonC Punkte 1117238

Seit Git1.6.3 können Sie die Git-Difftool-Skript : siehe meine Antwort unten .


Das kann sein Artikel wird Ihnen helfen. Hier sind die besten Teile:

Es gibt zwei verschiedene Möglichkeiten, ein externes Diff-Tool anzugeben.

Die erste ist die von Ihnen verwendete Methode, indem Sie die Variable GIT_EXTERNAL_DIFF setzen. Die Variable muss jedoch auf den vollständigen Pfad der ausführbaren Datei verweisen. Außerdem wird die durch GIT_EXTERNAL_DIFF angegebene ausführbare Datei mit einem festen Satz von 7 Argumenten aufgerufen:

path old-file old-hex old-mode new-file new-hex new-mode

Da die meisten Diff-Tools eine andere Reihenfolge (und nur einige) der Argumente verlangen, werden Sie stattdessen wahrscheinlich ein Wrapper-Skript angeben müssen, das wiederum das eigentliche Diff-Tool aufruft.

Die zweite Methode, die ich bevorzuge, ist Konfigurieren Sie das externe Diff-Werkzeug über "git config" . Ich habe Folgendes getan:

1) Erstellen Sie ein Wrapper-Skript "git-diff-wrapper.sh", das etwas enthält wie

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

Wie Sie sehen, werden nur das zweite ("old-file") und das fünfte ("new-file") Argument an das Diff-Werkzeug übergeben.

2) Typ

$ git config --global diff.external <path_to_wrapper_script>

an der Eingabeaufforderung und ersetzen Sie es durch den Pfad zu "git-diff-wrapper.sh", so dass Ihre ~/.gitconfig Folgendes enthält

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

Stellen Sie sicher, dass Sie die richtige Syntax verwenden, um die Pfade zum Wrapper-Skript und zum diff Werkzeug anzugeben, d.h. verwenden Sie Schrägstriche anstelle von Backslashes. In meinem Fall habe ich

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

in .gitconfig und

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

im Wrapper-Skript. Achten Sie auf das nachgestellte "cat"!

(Ich nehme an, das | cat ' ist nur für einige Programme erforderlich, die möglicherweise keinen korrekten oder konsistenten Rückgabestatus liefern. Wenn Ihr Diff-Tool einen expliziten Rückgabestatus hat, können Sie es auch ohne das nachgestellte cat versuchen.)

( Diomidis Spinellis fügt hinzu. in den Kommentaren :

El cat ist erforderlich, weil diff(1) wird standardmäßig mit einem Fehlercode beendet, wenn sich die Dateien unterscheiden.
Git erwartet, dass das externe Diff-Programm nur dann mit einem Fehlercode beendet wird, wenn ein tatsächlicher Fehler aufgetreten ist, z. B. wenn der Speicher voll ist.
Durch die Weiterleitung der Ausgabe von git a cat der Fehlercode ungleich Null wird maskiert.
Effizienter wäre es, wenn das Programm einfach Folgendes ausführen würde exit mit einem Argument von 0).


Das (der oben zitierte Artikel) ist die Theorie für externe Werkzeuge definiert durch die Konfigurationsdatei (nicht über die Umgebungsvariable).
In der Praxis (noch für die Definition der Konfigurationsdatei des externen Tools) können Sie sich auf:

2 Stimmen

Ah, ich hatte das externe Diff-Programm eingestellt, wusste aber nichts von den 7 Argumenten, danke.

5 Stimmen

Hut ab ... das ist sehr praktisch. Ich habe dies mit "opendiff" eingerichtet (was das elegante XCode FileMerge-Dienstprogramm unter Mac OS X startet).

1 Stimmen

@Ryan: Das ist großartig :) Haben Sie die in dieser Antwort beschriebene Einstellung "diff.external" oder das "git difftool" aus meiner zweiten Antwort unten verwendet?

227voto

VonC Punkte 1117238

Zur Vervollständigung meiner vorherigen "diff.external" Konfigurationsantwort oben:

Als erwähnt von Jakub , Git1.6.3 eingeführt git difftool die ursprünglich im September 2008 vorgeschlagen wurde:

USAGE= '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Siehe --extcmd im letzten Teil dieser Antwort)

$LOCAL enthält den Inhalt der Datei ab der Startrevision und $REMOTE enthält den Inhalt der Datei in der Endrevision.
$BASE enthält den Inhalt der Datei in der Datei wor

Es ist im Grunde git-mergetool geändert, um mit dem Git-Index/Arbeitsbaum zu arbeiten.

Der übliche Anwendungsfall für dieses Skript ist, wenn Sie entweder Staged- oder Unstaged-Änderungen haben und die Änderungen in einem Diff-Viewer nebeneinander sehen möchten (z.B. xxdiff , tkdiff , usw.).

git difftool [<filename>*]

Ein anderer Anwendungsfall ist, wenn man dieselben Informationen sehen möchte, aber beliebige Commits vergleicht (dies ist der Teil, in dem das Parsen von revarg besser sein könnte)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

Der letzte Anwendungsfall ist, wenn Sie Ihren aktuellen Arbeitsbaum mit etwas anderem als HEAD (z. B. einem Tag) vergleichen möchten

git difftool --commit=v1.0.0 [-- <filename>*]

Hinweis: Seit Git 2.5, git config diff.tool winmerge ist genug!
Siehe " git mergetool winmerge "

Und seit Git 1.7.11 haben Sie die Möglichkeit --dir-diff um externe Diff-Tools zu starten, die zwei Verzeichnishierarchien auf einmal vergleichen können, nachdem zwei temporäre Verzeichnisse angelegt wurden, anstatt eine Instanz des externen Tools einmal pro Dateipaar auszuführen.


Vor Git 2.5:

Praktischer Fall für das Konfigurieren difftool mit Ihrem benutzerdefinierten Diff-Werkzeug:

C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false

Wenn winmerge.sh in einem Verzeichnis in Ihrem PATH gespeichert ist:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

Wenn Sie ein anderes Tool haben (kdiff3, P4Diff, ...), erstellen Sie ein weiteres Shell-Skript und die entsprechende difftool.myDiffTool.cmd config-Richtlinie.
Dann können Sie ganz einfach mit der Taste diff.tool Konfiguration.

Sie haben auch diese Blogeintrag von Dave um weitere Details hinzuzufügen.
(Oder diese Frage für die winmergeu Optionen)

Das Interessante an dieser Einstellung ist die winmerge.sh Skript : Sie können sie anpassen, um besondere Fälle zu berücksichtigen.

Siehe zum Beispiel David Marmor 's Antwort unten für ein Beispiel, das sich mit:

  • neu Dateien entweder im Ursprung oder im Ziel
  • entfernt Dateien entweder im Ursprung oder im Ziel

Als Kem Mason Erwähnungen in seine Antwort können Sie auch vermeiden Sie jeden Wrapper, indem Sie die --extcmd Option :

--extcmd=<command>

Geben Sie einen benutzerdefinierten Befehl zum Anzeigen von Diffs an. git-difftool ignoriert die konfigurierten Standardeinstellungen und führt $command $LOCAL $REMOTE wenn diese Option angegeben ist.

So wird zum Beispiel gitk ist in der Lage, jede diff Werkzeug .

11 Stimmen

Ich musste die $ für $LOCAL und $REMOTE mit Escapezeichen versehen, um zu verhindern, dass sie zu "" und "" werden. Ich würde das so ändern, dass git config --globla difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""

0 Stimmen

Auch jede Idee, wie man die Option -s (mehrere Diffs in einem Winmerge-Fenster öffnen), um in diesem Schema zu arbeiten?

0 Stimmen

@Frank: Ich bestätige, die $PATH o %PATH% respektiert wird, wenn es um die git config Direktiven (was ist Ihr Setup? Git-Version? Betriebssystem?). Und wenn Sie einen Beitrag an Carlos weiterleiten wollen, muss Ihr Kommentar mit ' @ ': @Carlos (siehe meta.stackexchange.com/questions/1093/ )

121voto

Charles Merriam Punkte 18484

Versuchen Sie diese Lösung:

$ meld my_project_using_git

Meldung versteht Git und bietet die Möglichkeit, sich in den jüngsten Änderungen zurechtzufinden.

19 Stimmen

Das ist toll, viel einfacher zu tippen meld . als git difftool und müssen geänderte Dateien nacheinander anzeigen. Und es ist viel näher an Mercurial's hg vdiff Plugin.

7 Stimmen

Auch, meld . funktioniert auch bei Mercurial- und Subversion-Projekten, falls es jemanden interessiert.

0 Stimmen

Wenn ich dies tue, wird eine Liste der geänderten Dateien angezeigt. Wenn ich auf eine von ihnen klicke oder "Vergleichen" wähle, wird sie in einer separaten Registerkarte geöffnet. Wie erhalte ich einen Vergleich?

52voto

Seba Illingworth Punkte 5304

Mit dem neuen git difftool ist es so einfach wie das Hinzufügen zu Ihrem .gitconfig Datei:

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

Optional können Sie auch hinzufügen:

[difftool]
    prompt = false

Besuchen Sie auch . ein einfaches Skript, das ich geschrieben habe, um das lästige (IMO) Standard-Diff-Verhalten des Öffnens in Serie zu erweitern.

Die globale .gitconfig unter Windows befindet sich in %USERPROFILE%\.gitconfig

1 Stimmen

Was ist $local und was ist $remote?

3 Stimmen

+1 für eine Methode, die kein Wrapper-Skript erfordert

0 Stimmen

@CJohnson: Pfad zur Originaldatei bzw. Pfad zur bearbeiteten Datei.

45voto

Jakub Narębski Punkte 286531

Seit Git Version 1.6.3 gibt es " Git-Difftool ", das Sie so konfigurieren können, dass es Ihr bevorzugtes grafisches Vergleichsprogramm verwendet.

Derzeit (zum Zeitpunkt des Verfassens dieser Antwort) werden folgende Funktionen unterstützt (out-of-the-box) KDiff3 , Kompare , tkdiff , Meldung , xxdiff , emerge, vimdiff, gvimdiff, ecmerge, Diffus y opendiff Wenn das gewünschte Werkzeug nicht in dieser Liste enthalten ist, können Sie jederzeit ' difftool.<tool>.cmd ' Konfigurationsoption.

"git difftool" akzeptiert die gleichen Optionen wie "git diff".

1 Stimmen

Araxis Merge ist ebenfalls konfiguriert. araxis.com/merge/scm_integration.html

12 Stimmen

Anwendungsbeispiel: git difftool -t kdiff3 HEAD

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X