Wie kann ich die Ausgabe von 'git diff' mit meinem bevorzugten Diff-Tool / Viewer anzeigen?
754
Wenn ich git difftippe, möchte ich die Ausgabe mit dem visuellen Diff-Tool Ihrer Wahl anzeigen (SourceGear "diffmerge" unter Windows). Wie konfiguriere ich git dafür?
Gehen Sie zu Ihrem Repository in Git Bash. Typ git config diff.tool winmerge. Überprüfen Sie durch Eingabe, ob es funktioniert hat git difftool. Befreien Sie sich von der Eingabeaufforderung git config --global difftool.prompt false. Ich empfehle p4merge anstelle von winmerge.
Michael S.
Antworten:
386
Seit Git1.6.3 können Sie das Git-Difftool-Skript verwenden : siehe meine Antwort unten .
Vielleicht hilft Ihnen dieser Artikel . Hier sind die besten Teile:
Es gibt zwei verschiedene Möglichkeiten, ein externes Diff-Tool anzugeben.
Die erste ist die Methode, die Sie verwendet haben, indem Sie die Variable GIT_EXTERNAL_DIFF festgelegt haben. Die Variable soll jedoch auf den vollständigen Pfad der ausführbaren Datei verweisen. Darüber hinaus wird die von GIT_EXTERNAL_DIFF angegebene ausführbare Datei mit einem festen Satz von 7 Argumenten aufgerufen:
Da die meisten Diff-Tools eine andere Reihenfolge (und nur einige) der Argumente erfordern, müssen Sie höchstwahrscheinlich stattdessen ein Wrapper-Skript angeben, das wiederum das echte Diff-Tool aufruft.
Die zweite Methode, die ich bevorzuge, ist die Konfiguration des externen Diff-Tools über "git config" . Folgendes habe ich getan:
1) Erstellen Sie ein Wrapper-Skript "git-diff-wrapper.sh", das so etwas enthält
-->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 können, werden nur das zweite ("alte Datei") und das fünfte ("neue Datei") Argument an das Diff-Tool übergeben.
Stellen Sie sicher, dass Sie die richtige Syntax verwenden, um die Pfade zum Wrapper-Skript und zum Diff-Tool anzugeben, dh verwenden Sie Schrägstriche anstelle von Schrägstrichen. In meinem Fall habe ich
[diff]
external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
im Wrapper-Skript. Pass auf die nachlaufende "Katze" auf!
(Ich nehme an, das ' | cat' wird nur für einige Programme benötigt, die möglicherweise keinen ordnungsgemäßen oder konsistenten Rückgabestatus zurückgeben. Möglicherweise möchten Sie es ohne die nachfolgende Katze versuchen, wenn Ihr Diff-Tool einen expliziten Rückgabestatus hat.)
Der catBefehl ist erforderlich, da er diff(1)standardmäßig mit einem Fehlercode beendet wird, 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 nicht genügend Speicher vorhanden ist.
Durch Weiterleiten wird die Ausgabe gitan catden Fehlercode ungleich Null maskiert.
Effizienter könnte das Programm nur exitmit einem Argument von 0 ausgeführt werden.)
Dies (der oben zitierte Artikel) ist die Theorie für ein externes Tool, die durch die Konfigurationsdatei (nicht durch die Umgebungsvariable) definiert wird.
In der Praxis (noch zur Definition der Konfigurationsdatei eines externen Tools) können Sie sich auf Folgendes beziehen:
Ah, ich hatte das externe Diff-Programm eingestellt, wusste aber nichts über die 7 Argumente, danke.
user3891
4
Kudos ... das ist sehr praktisch. Ich habe dies mit "opendiff" eingerichtet (das das schicke XCode FileMerge-Dienstprogramm unter Mac OS X startet).
Ryan Delucchi
@ Ryan: das ist großartig :) Hast du die in dieser Antwort beschriebene Einstellung "diff.external" oder das "git difftool" meiner zweiten Antwort unten verwendet?
VonC
Fantastisch! Vielen Dank, habe sowohl DiffMerge als auch Opendiff ausprobiert. beide funktionieren ganz gut.
Vfilby
2
Git sendet also 7 Argumente an ein Diff-Programm? Je mehr ich über Git lerne, desto mehr denke ich, dass es für eine Person gemacht wurde: den ursprünglichen Programmierer. Dieser DVD scheint eher ein glänzendes Spielzeug zu sein, das nicht viel bringt.
USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Siehe --extcmdim letzten Teil dieser Antwort)
$LOCALenthält den Inhalt der Datei aus der Startrevision und $REMOTEenthält den Inhalt der Datei aus der Endrevision. $BASEenthält den Inhalt der Datei in der Arbeit
Es ist grundsätzlich git-mergetoolmodifiziert, um mit dem Git-Index / Arbeitsbaum zu arbeiten.
Die übliche Anwendungsfall für dieses Skript ist , wenn Sie entweder inszeniert haben oder unstaged Änderungen und Sie möchten , dass die Änderungen in einer Side-by-Side - Vergleichsprogramme sehen (zB xxdiff, tkdiffusw.).
git difftool [<filename>*]
Ein anderer Anwendungsfall ist, wenn Sie dieselben Informationen sehen möchten, aber beliebige Commits vergleichen möchten (dies ist der Teil, in dem das Pararg-Parsing besser sein könnte).
Und seit Git 1.7.11 haben Sie die Möglichkeit --dir-diff, externe Diff-Tools zu erstellen , die nach dem Auffüllen von zwei temporären Verzeichnissen zwei Verzeichnishierarchien gleichzeitig vergleichen können, anstatt eine Instanz des externen Tools einmal pro Dateipaar auszuführen .
Vor Git 2.5:
Praktischer Fall für die Konfiguration difftoolmit Ihrem benutzerdefinierten Diff-Tool:
Wenn Sie ein anderes Tool haben (kdiff3, P4Diff, ...), erstellen Sie ein anderes Shell-Skript und die entsprechende difftool.myDiffTool.cmdKonfigurationsanweisung.
Dann können Sie mit der diff.toolKonfiguration einfach die Werkzeuge wechseln .
Geben Sie einen benutzerdefinierten Befehl zum Anzeigen von Unterschieden an. git-difftoolignoriert die konfigurierten Standardeinstellungen und wird ausgeführt, $command $LOCAL $REMOTEwenn diese Option angegeben ist.
Ich musste dem $ entkommen, für $ LOCAL und $ REMOTE, um zu verhindern, dass sie "" und "" werden. Ich würde bearbeiten, um zu sagen, git config --globla difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" \ $ REMOTE \ ""
Carlos Rendon
Gibt es auch eine Idee, wie die Option -s (mehrere Unterschiede in einem Winmerge-Fenster öffnen) in diesem Schema funktioniert?
Das ist großartig, viel einfacher zu tippen meld .als git difftoolgeänderte Dateien nacheinander anzuzeigen und anzuzeigen. Und es ist viel näher an Mercurials hg vdiffPlugin.
Tom
6
Arbeitet auch meld .an Mercurial- und Subversion-Projekten, falls jemand neugierig ist.
Tom
Hmm, wenn ich das mache, wird eine Liste der geänderten Dateien angezeigt. Wenn ich auf eine davon klicke oder "vergleiche", wird sie alleine in einer separaten Registerkarte geöffnet. Wie bekomme ich einen Unterschied?
misiu_mp
@misiu_mp, ich habe es gerade versucht. Beim Klicken auf die geänderten Dateien wird der Unterschied angezeigt (alte Datei sowie geänderte Datei).
db42
In welcher Version wurde dies hinzugefügt? Es scheint nicht mit der Meld-Version zu funktionieren 1.1.5.
Mark Booth
41
Mit dem neuen git difftool ist es so einfach wie das Hinzufügen zu Ihrer .gitconfig- Datei:
Schauen Sie sich auch diffall an , ein einfaches Skript, das ich geschrieben habe, um das nervige (IMO) Standard-Diff-Verhalten beim Öffnen in Serie zu erweitern.
Die globale .gitconfig unter Windows befindet sich in %USERPROFILE%\.gitconfig
@CJohnson: $ LOCAL ist immer das neueste Commit. $ REMOTE ist jedoch nicht konsistent. Wenn Sie sich Änderungen in der lokalen Sandbox ansehen, handelt es sich um die aktuelle / bearbeitete Datei. Bei unterschiedlichen historischen Commits handelt es sich jedoch um das übergeordnete Commit. IOW für normale Unterschiede $ LOCAL = alt und $ REMOTE = neu. Für historisch ist $ LOCAL = neuer und $ REMOTE = älter.
Granger
40
Seit Git Version 1.6.3 gibt es " Git Difftool ", das Sie so konfigurieren können, dass Sie Ihr bevorzugtes grafisches Diff-Tool verwenden. Derzeit werden standardmäßig kdiff3, kompare, tkdiff, meld, xxdiff, emer, vimdiff, gvimdiff, ecmerge, diffuse und opendiff unterstützt . Wenn das gewünschte Tool nicht in dieser Liste enthalten ist, können Sie jederzeit die difftool.<tool>.cmdKonfigurationsoption ' ' verwenden.
"git difftool" akzeptiert die gleichen Optionen wie "git diff".
Ich habe eine Ergänzung dazu. Ich verwende regelmäßig eine Diff-App, die nicht als eines der Standardwerkzeuge (z. B. Kaleidoskop) unterstützt wird
git difftool -t
Ich möchte auch, dass die Standardeinstellung diffnur die reguläre Befehlszeile ist, daher ist das Festlegen der GIT_EXTERNAL_DIFFVariablen keine Option.
diffMit diesem Befehl können Sie eine beliebige App einmalig verwenden:
git difftool --extcmd=/usr/bin/ksdiff
Es werden nur die 2 Dateien an den von Ihnen angegebenen Befehl übergeben, sodass Sie wahrscheinlich auch keinen Wrapper benötigen.
Hervorragende Ergänzung zum winmerge.shSkript. +1. Ich habe meine Antwort aktualisiert , um auf Ihre zu verlinken.
VonC
1
winmerge.batim zweiten Snippet sollte seinwinmerge.sh
BartoszKP
Können Sie dies für viele Werkzeuge machen? Und sie durch Dateierweiterung verknüpfen?
Yucer
12
Lösung für Windows / msys git
Nachdem ich die Antworten gelesen hatte, entdeckte ich einen einfacheren Weg, bei dem nur eine Datei geändert wurde.
Erstellen Sie eine Batch-Datei zum Aufrufen Ihres Diff-Programms mit den Argumenten 2 und 5. Diese Datei muss sich irgendwo in Ihrem Pfad befinden. (Wenn Sie nicht wissen, wo das ist, legen Sie es in c: \ windows). Nennen Sie es zum Beispiel "gitdiff.bat". Meins ist:
@echo off
REM This is gitdiff.bat
"C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
Stellen Sie die Umgebungsvariable so ein, dass sie auf Ihre Batchdatei verweist. Zum Beispiel : GIT_EXTERNAL_DIFF=gitdiff.bat. Oder durch Powershell durch Tippen git config --global diff.external gitdiff.bat.
Es ist wichtig, keine Anführungszeichen zu verwenden oder Pfadinformationen anzugeben, da dies sonst nicht funktioniert. Deshalb muss gitdiff.bat auf Ihrem Weg sein.
Wenn Sie nun "git diff" eingeben, wird Ihr externer Diff-Viewer aufgerufen.
+1 (+10 wenn ich könnte.) Dies ist wirklich die einfachste Lösung. Ich kämpfte stundenlang mit der akzeptierten Antwort und gab schließlich auf (einige meiner Probleme standen wahrscheinlich im Zusammenhang mit der Ausführung von Git über PowerShell ...). Ich habe jedoch git config --global diff.external winmerge.cmdanstelle der GIT_EXTERNAL_DIFFUmgebungsvariablen verwendet, und es funktioniert genauso gut.
Christoffer Lette
Einige Probleme mit dieser Lösung: 1. Funktioniert nicht für neue Dateien. WinMerge fordert mich auf, eine zweite Datei zum Vergleich einzugeben. 2. Das Fenster zum Vergleichen der nächsten Datei wird erst geöffnet, nachdem Sie das aktuelle WinMerge-Fenster geschlossen haben. Es ist nicht einfach, alle Dateien gleichzeitig anzuzeigen.
Jesus H
9
Wenn Sie dies über Cygwin tun, müssen Sie möglicherweise Cygpath verwenden :
Aus irgendeinem Grund funktioniert die Verwendung von "bc3" bei mir nicht mehr, aber wenn ich stattdessen "beyond" verwende, ist das in Ordnung.
idbrii
9
Nachdem ich mir einige andere externe Diff-Tools angesehen hatte, stellte ich fest, dass die diffAnsicht in IntelliJ IDEA (und Android Studio) die beste für mich ist.
Schritt 1 - Richten Sie IntelliJ IDEA so ein, dass es über die Befehlszeile ausgeführt wird
Wenn Sie IntelliJ IDEA als Diff-Tool verwenden möchten, sollten Sie zuerst IntelliJ IDEA so einrichten , dass es über die Befehlszeile ausgeführt wird. Befolgen Sie dazu die folgenden Anweisungen :
Unter MacOS oder UNIX:
Stellen Sie sicher, dass IntelliJ IDEA ausgeführt wird.
Wählen Sie im Hauptmenü Tools | Create Command-line Launcher. Das Dialogfeld Launcher-Skript erstellen wird mit dem vorgeschlagenen Pfad und Namen des Launcher-Skripts geöffnet. Sie können die Standardeinstellung akzeptieren oder Ihren eigenen Pfad angeben. Beachten Sie dies, da Sie es später benötigen. Fügen Sie außerhalb von IntelliJ IDEA den Pfad und den Namen des Startskripts zu Ihrem Pfad hinzu.
Unter Windows:
Geben Sie den Speicherort der ausführbaren IntelliJ IDEA-Datei in der Umgebungsvariablen Path an. In diesem Fall können Sie die ausführbare IntelliJ IDEA-Datei und andere IntelliJ IDEA-Befehle aus einem beliebigen Verzeichnis aufrufen.
Schritt 2 - Konfigurieren Sie git so, dass IntelliJ IDEA als Difftool verwendet wird
Haben Sie auch kdiff3 als Ihr Mergetool definiert? Hast du etwas dagegen, diesen Teil deiner gitconfig zu teilen, wenn ja?
Blong
2
Vielen Dank. Dies funktionierte nicht ganz für mich, aber es funktionierte, als ich entfernte pathund cmdzu"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Steve Chambers
7
Eine kurze Zusammenfassung der oben genannten großartigen Antworten:
Als Referenz möchte ich meine Variation der Antwort von VonC aufnehmen. Denken Sie daran, dass ich die MSys-Version von Git (derzeit 1.6.0.2) mit modifiziertem PATH verwende und Git selbst von Powershell (oder cmd.exe) aus starte, nicht von der Bash-Shell.
Ich habe einen neuen Befehl eingeführt gitdiff. Wenn Sie diesen Befehl vorübergehend ausführen git diff, wird ein visuelles Diff-Programm Ihrer Wahl umgeleitet (im Gegensatz zu der Lösung von VonC, die dies dauerhaft ausführt). Dadurch kann ich sowohl die Standard-Git-Diff-Funktionalität ( git diff) als auch die Visual-Diff-Funktionalität ( gitdiff) verwenden. Beide Befehle verwenden dieselben Parameter, um beispielsweise Änderungen in einer bestimmten Datei, die Sie eingeben können, visuell zu unterscheiden
gitdiff path/file.txt
Installieren
Beachten Sie, dass dies $GitInstallals Platzhalter für das Verzeichnis verwendet wird, in dem Git installiert ist.
Neue Datei erstellen, $GitInstall\cmd\gitdiff.cmd
@echo off
setlocal
for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
if "%HOME%"=="" @set HOME=%USERPROFILE%
set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
set GIT_PAGER=cat
git diff %*
endlocal
Erstellen Sie eine neue Datei $GitInstall\bin\git-diff-visual.cmd(ersetzen Sie den [visual_diff_exe]Platzhalter durch den vollständigen Pfad zum Diff-Programm Ihrer Wahl).
@echo off
rem diff is called by git with 7 parameters:
rem path old-file old-hex old-mode new-file new-hex new-mode
echo Diffing "%5"
"[visual_diff_exe]" "%2" "%5"
exit 0
Du bist jetzt fertig. Das Ausführen gitdiffaus einem Git-Repository sollte jetzt Ihr Visual Diff-Programm für jede geänderte Datei aufrufen.
Hier ist eine Batch-Datei, die für Windows funktioniert - setzt voraus, dass DiffMerge am Standardspeicherort installiert ist, x64 verarbeitet, bei Bedarf den Backslash-Austausch weiterleitet und sich selbst installieren kann. Es sollte einfach sein, DiffMerge durch Ihr bevorzugtes Diff-Programm zu ersetzen.
Installieren:
gitvdiff --install
gitvdiff.bat:
@echo off
REM ---- Install? ----
REM To install, run gitvdiff --install
if %1==--install goto install
REM ---- Find DiffMerge ----
if DEFINED ProgramFiles^(x86^) (
Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)
REM ---- Switch forward slashes to back slashes ----
set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%
REM ---- Launch DiffMerge ----
%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%
goto :EOF
REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off
:EOF
Tolles Skript, es hat mir die Mühe erspart, DiffMerge-Befehle zu suchen. Möglicherweise möchten Sie die Installationszeile ändern, um Anführungszeichen zu verwenden. Ich hatte Probleme auf meinem Computer: "% 1" == "- install".
Mario
6
Wenn Sie auf einem Mac arbeiten und XCode haben, ist FileMerge installiert. Der Terminalbefehl ist opendiff, also können Sie es einfach tungit difftool -t opendiff
Verwenden Sie die Option -y, um störende Eingabeaufforderungen zu vermeiden. Leider wartet git, bis FileMerge beendet wird, bevor die nächste geänderte Datei angeboten wird. Verwenden Sie die Option -d, um einen Verzeichnisvergleich auf einmal durchzuführen.
Miner49r
Die Option -t scheint den vollständigen Pfad zu erfordern. Vielleicht ist es besser, git difftool --extcmd = opendiff zu verwenden.
Yucer
6
Installieren Sie meld
# apt-get install meld
Dann wählen Sie das als Difftool
$ git config --global diff.tool meld
Wenn Sie es auf der Konsole ausführen möchten, geben Sie Folgendes ein:
$ git difftool
Wenn Sie den Grafikmodus verwenden möchten, geben Sie Folgendes ein:
$ git mergetool
Und die Ausgabe wäre:
'git mergetool' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
Merging:
www/css/style.css
www/js/controllers.js
Normal merge conflict for 'www/css/style.css':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (meld):
Drücken Sie einfach die Eingabetaste, um meld zu verwenden (Standard). Dadurch wird der Grafikmodus geöffnet, die Magie gespeichert und die Taste gedrückt, mit der die Zusammenführung aufgelöst wird. Das ist alles
Für eine Linux-Version zum Konfigurieren eines Diff-Tools für Git-Versionen vor 1.6.3 (1.6.3 hat Difftool zu Git hinzugefügt) ist dies ein großartiges, kurzes Tutorial.
in Kürze:
Schritt 1: Fügen Sie dies Ihrer .gitconfig hinzu
[diff]
external = git_diff_wrapper
[pager]
diff =
Schritt 2: Erstellen Sie eine Datei mit dem Namen git_diff_wrapper und legen Sie sie irgendwo in Ihrem $ PATH ab
Das Folgende kann aus den anderen Antworten hier entnommen werden, aber für mich ist es schwierig (zu viele Informationen), daher hier die Antwort für tkdiff: Geben Sie es einfach ein:
git difftool --tool=tkdiff <path to the file to be diffed>
Sie können tkdiff durch den ausführbaren Namen Ihres bevorzugten unterschiedlichen Tools ersetzen. Solange (z. B. tkdiff) (oder Ihr bevorzugtes Diffing-Tool) in Ihrem PATH enthalten ist, wird es gestartet.
Ich habe das schicke Zeug hier ausprobiert (mit tkdiff) und nichts hat bei mir funktioniert. Also schrieb ich das folgende Skript, tkgitdiff. Es macht das, wofür ich es brauche.
$ cat tkgitdiff
#!/bin/sh
#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#
newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile
#!/bin/bash
if [ "$DISPLAY" = "" ];
then
diff $2 $5
else
meld $2 $5
fi
Aber jetzt habe ich es satt, in einer grafischen Umgebung immer meld zu verwenden, und es ist nicht trivial, mit diesem Setup den normalen Diff aufzurufen, also habe ich zu folgendem gewechselt:
Wenn Sie bereits ein Diff-Tool für Dateitypen haben (z. B. weil Sie TortoiseSVN installiert haben, das mit einem Diff-Viewer geliefert wird), können Sie die reguläre git diffAusgabe einfach an eine "temporäre" Datei weiterleiten und diese Datei dann direkt öffnen, ohne es zu wissen alles über den Betrachter:
git diff > "~/temp.diff" && start "~/temp.diff"
Das Festlegen als globaler Alias funktioniert noch besser: git what
Wenn Sie nicht für die Befehlszeile zuständig sind, können Sie bei der Installation von tortoise git mit der rechten Maustaste auf eine Datei klicken, um ein Tortoisegit-Untermenü mit der Option "Diff later" aufzurufen.
Wenn Sie dies in der ersten Datei auswählen, können Sie mit der rechten Maustaste auf die zweite Datei klicken, zum Untermenü "Tortoisegit" gehen und "Diff with == yourfilehere ==" auswählen. Dadurch wird die Tortoisegitmerge-GUI für das Ergebnis angezeigt.
Vielleicht möchten Sie xd http://github.com/jiqingtang/xd ausprobieren, einen GUI-Wrapper für GIT / SVN diff. Es ist KEIN Diff-Tool. Sie laufen, xdwenn Sie laufen wollen git diffodersvn diff und es wird Ihnen eine Liste von Dateien zeigen, ein Vorschaufenster und Sie können jede Diff - Tool starten Sie so wollen, einschließlich tkdiff, xxdiff, gvimdiff, Emacs (ediff), xemacs (ediff), meld, diffuse, kompare und kdiff3. Sie können auch ein beliebiges benutzerdefiniertes Tool ausführen.
git config diff.tool winmerge
. Überprüfen Sie durch Eingabe, ob es funktioniert hatgit difftool
. Befreien Sie sich von der Eingabeaufforderunggit config --global difftool.prompt false
. Ich empfehle p4merge anstelle von winmerge.Antworten:
Seit Git1.6.3 können Sie das Git-Difftool-Skript verwenden : siehe meine Antwort unten .
Vielleicht hilft Ihnen dieser Artikel . Hier sind die besten Teile:
Es gibt zwei verschiedene Möglichkeiten, ein externes Diff-Tool anzugeben.
Die erste ist die Methode, die Sie verwendet haben, indem Sie die Variable GIT_EXTERNAL_DIFF festgelegt haben. Die Variable soll jedoch auf den vollständigen Pfad der ausführbaren Datei verweisen. Darüber hinaus wird die von GIT_EXTERNAL_DIFF angegebene ausführbare Datei mit einem festen Satz von 7 Argumenten aufgerufen:
Da die meisten Diff-Tools eine andere Reihenfolge (und nur einige) der Argumente erfordern, müssen Sie höchstwahrscheinlich stattdessen ein Wrapper-Skript angeben, das wiederum das echte Diff-Tool aufruft.
Die zweite Methode, die ich bevorzuge, ist die Konfiguration des externen Diff-Tools über "git config" . Folgendes habe ich getan:
1) Erstellen Sie ein Wrapper-Skript "git-diff-wrapper.sh", das so etwas enthält
Wie Sie sehen können, werden nur das zweite ("alte Datei") und das fünfte ("neue Datei") Argument an das Diff-Tool übergeben.
2) Typ
Ersetzen Sie an der Eingabeaufforderung durch den Pfad zu "git-diff-wrapper.sh", damit Ihre ~ / .gitconfig enthält
Stellen Sie sicher, dass Sie die richtige Syntax verwenden, um die Pfade zum Wrapper-Skript und zum Diff-Tool anzugeben, dh verwenden Sie Schrägstriche anstelle von Schrägstrichen. In meinem Fall habe ich
in .gitconfig und
im Wrapper-Skript. Pass auf die nachlaufende "Katze" auf!
(Ich nehme an, das '
| cat
' wird nur für einige Programme benötigt, die möglicherweise keinen ordnungsgemäßen oder konsistenten Rückgabestatus zurückgeben. Möglicherweise möchten Sie es ohne die nachfolgende Katze versuchen, wenn Ihr Diff-Tool einen expliziten Rückgabestatus hat.)( Diomidis Spinellis fügt in den Kommentaren hinzu :
Dies (der oben zitierte Artikel) ist die Theorie für ein externes Tool, die durch die Konfigurationsdatei (nicht durch die Umgebungsvariable) definiert wird.
In der Praxis (noch zur Definition der Konfigurationsdatei eines externen Tools) können Sie sich auf Folgendes beziehen:
quelle
Um meine vorherige "diff.external" -Konfigurationsantwort oben zu vervollständigen :
Wie von Jakub erwähnt , führte Git1.6.3 das ursprünglich im September 2008 vorgeschlagene Git Difftool ein :
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 aus der Startrevision und$REMOTE
enthält den Inhalt der Datei aus der Endrevision.$BASE
enthält den Inhalt der Datei in der ArbeitDer letzte Anwendungsfall ist, wenn Sie Ihren aktuellen Arbeitsbaum mit etwas anderem als HEAD (z. B. einem Tag) vergleichen möchten.
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
, externe Diff-Tools zu erstellen , die nach dem Auffüllen von zwei temporären Verzeichnissen zwei Verzeichnishierarchien gleichzeitig vergleichen können, anstatt eine Instanz des externen Tools einmal pro Dateipaar auszuführen .Vor Git 2.5:
Praktischer Fall für die Konfiguration
difftool
mit Ihrem benutzerdefinierten Diff-Tool:Mit winmerge.sh in einem Verzeichnis Ihres PATH gespeichert:
Wenn Sie ein anderes Tool haben (kdiff3, P4Diff, ...), erstellen Sie ein anderes Shell-Skript und die entsprechende
difftool.myDiffTool.cmd
Konfigurationsanweisung.Dann können Sie mit der
diff.tool
Konfiguration einfach die Werkzeuge wechseln .Sie haben auch diesen Blogeintrag von Dave , um weitere Details hinzuzufügen.
(Oder diese Frage für die
winmergeu
Optionen)Das Interesse an dieser Einstellung ist das
winmerge.sh
Skript : Sie können es anpassen, um Sonderfälle zu berücksichtigen.Siehe zum Beispiel David Marble ‚s Antwort unten für ein Beispiel , das mich mit:
Wie Kem Mason in seiner Antwort erwähnt , können Sie auch Wrapper vermeiden, indem Sie die
--extcmd
Option verwenden :Auf diese Weise kann
gitk
beispielsweise ein beliebigesdiff
Tool ausgeführt / verwendet werden .quelle
--start=
und--end=
Optionen werden in v1.7.11Im Sinne der Beantwortung von Fragen, die etwas anders sind als gestellt. Versuchen Sie diese Lösung:
Meld versteht Git und bietet die Navigation zu den letzten Änderungen.
quelle
meld .
alsgit difftool
geänderte Dateien nacheinander anzuzeigen und anzuzeigen. Und es ist viel näher an Mercurialshg vdiff
Plugin.meld .
an Mercurial- und Subversion-Projekten, falls jemand neugierig ist.1.1.5
.Mit dem neuen git difftool ist es so einfach wie das Hinzufügen zu Ihrer .gitconfig- Datei:
Optional können Sie auch Folgendes hinzufügen:
Schauen Sie sich auch diffall an , ein einfaches Skript, das ich geschrieben habe, um das nervige (IMO) Standard-Diff-Verhalten beim Öffnen in Serie zu erweitern.
Die globale .gitconfig unter Windows befindet sich in
%USERPROFILE%\.gitconfig
quelle
Seit Git Version 1.6.3 gibt es " Git Difftool ", das Sie so konfigurieren können, dass Sie Ihr bevorzugtes grafisches Diff-Tool verwenden. Derzeit werden standardmäßig kdiff3, kompare, tkdiff, meld, xxdiff, emer, vimdiff, gvimdiff, ecmerge, diffuse und opendiff unterstützt . Wenn das gewünschte Tool nicht in dieser Liste enthalten ist, können Sie jederzeit die
difftool.<tool>.cmd
Konfigurationsoption ' ' verwenden."git difftool" akzeptiert die gleichen Optionen wie "git diff".
quelle
git difftool -t kdiff3 HEAD
Ich habe eine Ergänzung dazu. Ich verwende regelmäßig eine Diff-App, die nicht als eines der Standardwerkzeuge (z. B. Kaleidoskop) unterstützt wird
Ich möchte auch, dass die Standardeinstellung
diff
nur die reguläre Befehlszeile ist, daher ist das Festlegen derGIT_EXTERNAL_DIFF
Variablen keine Option.diff
Mit diesem Befehl können Sie eine beliebige App einmalig verwenden:Es werden nur die 2 Dateien an den von Ihnen angegebenen Befehl übergeben, sodass Sie wahrscheinlich auch keinen Wrapper benötigen.
quelle
--extcmd
Option bisher erwähnt . +1. Ich habe es in meine Antwort aufgenommen.Verwenden Sie die folgenden Befehle und Skripte, um auf der Antwort von VonC zum Entfernen und Hinzufügen von Dateien aufzubauen:
Welches ist das gleiche wie dies in Ihre globale setzen
.gitconfig
:Setzen Sie dann Folgendes ein,
winmerge.sh
das sich auf Ihrem Weg befinden muss:quelle
winmerge.sh
Skript. +1. Ich habe meine Antwort aktualisiert , um auf Ihre zu verlinken.winmerge.bat
im zweiten Snippet sollte seinwinmerge.sh
Lösung für Windows / msys git
Nachdem ich die Antworten gelesen hatte, entdeckte ich einen einfacheren Weg, bei dem nur eine Datei geändert wurde.
Erstellen Sie eine Batch-Datei zum Aufrufen Ihres Diff-Programms mit den Argumenten 2 und 5. Diese Datei muss sich irgendwo in Ihrem Pfad befinden. (Wenn Sie nicht wissen, wo das ist, legen Sie es in c: \ windows). Nennen Sie es zum Beispiel "gitdiff.bat". Meins ist:
Stellen Sie die Umgebungsvariable so ein, dass sie auf Ihre Batchdatei verweist. Zum Beispiel :
GIT_EXTERNAL_DIFF=gitdiff.bat
. Oder durch Powershell durch Tippengit config --global diff.external gitdiff.bat
.Es ist wichtig, keine Anführungszeichen zu verwenden oder Pfadinformationen anzugeben, da dies sonst nicht funktioniert. Deshalb muss gitdiff.bat auf Ihrem Weg sein.
Wenn Sie nun "git diff" eingeben, wird Ihr externer Diff-Viewer aufgerufen.
quelle
git config --global diff.external winmerge.cmd
anstelle derGIT_EXTERNAL_DIFF
Umgebungsvariablen verwendet, und es funktioniert genauso gut.Wenn Sie dies über Cygwin tun, müssen Sie möglicherweise Cygpath verwenden :
quelle
Nachdem ich mir einige andere externe Diff-Tools angesehen hatte, stellte ich fest, dass die
diff
Ansicht in IntelliJ IDEA (und Android Studio) die beste für mich ist.Schritt 1 - Richten Sie IntelliJ IDEA so ein, dass es über die Befehlszeile ausgeführt wird
Wenn Sie IntelliJ IDEA als Diff-Tool verwenden möchten, sollten Sie zuerst IntelliJ IDEA so einrichten , dass es über die Befehlszeile ausgeführt wird. Befolgen Sie dazu die folgenden Anweisungen :
Unter MacOS oder UNIX:
Tools | Create Command-line Launcher
. Das Dialogfeld Launcher-Skript erstellen wird mit dem vorgeschlagenen Pfad und Namen des Launcher-Skripts geöffnet. Sie können die Standardeinstellung akzeptieren oder Ihren eigenen Pfad angeben. Beachten Sie dies, da Sie es später benötigen. Fügen Sie außerhalb von IntelliJ IDEA den Pfad und den Namen des Startskripts zu Ihrem Pfad hinzu.Unter Windows:
Schritt 2 - Konfigurieren Sie git so, dass IntelliJ IDEA als Difftool verwendet wird
Befolgen Sie die Anweisungen in diesem Blog-Beitrag :
Bash
Fisch
Fügen Sie nun Ihrer Git-Konfiguration Folgendes hinzu:
Sie können es mit
git difftool
oder ausprobierengit difftool HEAD~1
quelle
Dies funktioniert für mich unter Windows 7. Es sind keine zwischengeschalteten Skripte erforderlich
Inhalt von .gitconfig:
quelle
path
undcmd
zu"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Eine kurze Zusammenfassung der oben genannten großartigen Antworten:
Verwenden Sie es dann durch Eingabe (optional auch unter Angabe des Dateinamens):
quelle
Einführung
Als Referenz möchte ich meine Variation der Antwort von VonC aufnehmen. Denken Sie daran, dass ich die MSys-Version von Git (derzeit 1.6.0.2) mit modifiziertem PATH verwende und Git selbst von Powershell (oder cmd.exe) aus starte, nicht von der Bash-Shell.
Ich habe einen neuen Befehl eingeführt
gitdiff
. Wenn Sie diesen Befehl vorübergehend ausführengit diff
, wird ein visuelles Diff-Programm Ihrer Wahl umgeleitet (im Gegensatz zu der Lösung von VonC, die dies dauerhaft ausführt). Dadurch kann ich sowohl die Standard-Git-Diff-Funktionalität (git diff
) als auch die Visual-Diff-Funktionalität (gitdiff
) verwenden. Beide Befehle verwenden dieselben Parameter, um beispielsweise Änderungen in einer bestimmten Datei, die Sie eingeben können, visuell zu unterscheidenInstallieren
Beachten Sie, dass dies
$GitInstall
als Platzhalter für das Verzeichnis verwendet wird, in dem Git installiert ist.Neue Datei erstellen,
$GitInstall\cmd\gitdiff.cmd
Erstellen Sie eine neue Datei
$GitInstall\bin\git-diff-visual.cmd
(ersetzen Sie den[visual_diff_exe]
Platzhalter durch den vollständigen Pfad zum Diff-Programm Ihrer Wahl).Du bist jetzt fertig. Das Ausführen
gitdiff
aus einem Git-Repository sollte jetzt Ihr Visual Diff-Programm für jede geänderte Datei aufrufen.quelle
Hier ist eine Batch-Datei, die für Windows funktioniert - setzt voraus, dass DiffMerge am Standardspeicherort installiert ist, x64 verarbeitet, bei Bedarf den Backslash-Austausch weiterleitet und sich selbst installieren kann. Es sollte einfach sein, DiffMerge durch Ihr bevorzugtes Diff-Programm zu ersetzen.
Installieren:
gitvdiff.bat:
quelle
Wenn Sie auf einem Mac arbeiten und XCode haben, ist FileMerge installiert. Der Terminalbefehl ist opendiff, also können Sie es einfach tun
git difftool -t opendiff
quelle
Installieren Sie meld
Dann wählen Sie das als Difftool
Wenn Sie es auf der Konsole ausführen möchten, geben Sie Folgendes ein:
Wenn Sie den Grafikmodus verwenden möchten, geben Sie Folgendes ein:
Und die Ausgabe wäre:
Drücken Sie einfach die Eingabetaste, um meld zu verwenden (Standard). Dadurch wird der Grafikmodus geöffnet, die Magie gespeichert und die Taste gedrückt, mit der die Zusammenführung aufgelöst wird. Das ist alles
quelle
Für eine Linux-Version zum Konfigurieren eines Diff-Tools für Git-Versionen vor 1.6.3 (1.6.3 hat Difftool zu Git hinzugefügt) ist dies ein großartiges, kurzes Tutorial.
in Kürze:
Schritt 1: Fügen Sie dies Ihrer .gitconfig hinzu
Schritt 2: Erstellen Sie eine Datei mit dem Namen git_diff_wrapper und legen Sie sie irgendwo in Ihrem $ PATH ab
quelle
Unter Mac OS X
erledigt den Job für mich im Git-Ordner. Für die Installation von diffus kann man port - verwenden
quelle
Sie können verwenden
git difftool
.wenn Sie zum Beispiel hat meld , können Sie die branchs bearbeiten
master
unddevel
durch:quelle
Das Folgende kann aus den anderen Antworten hier entnommen werden, aber für mich ist es schwierig (zu viele Informationen), daher hier die Antwort für tkdiff: Geben Sie es einfach ein:
Sie können tkdiff durch den ausführbaren Namen Ihres bevorzugten unterschiedlichen Tools ersetzen. Solange (z. B. tkdiff) (oder Ihr bevorzugtes Diffing-Tool) in Ihrem PATH enthalten ist, wird es gestartet.
quelle
Ich habe das schicke Zeug hier ausprobiert (mit tkdiff) und nichts hat bei mir funktioniert. Also schrieb ich das folgende Skript, tkgitdiff. Es macht das, wofür ich es brauche.
quelle
Ich benutze kompare auf Ubuntu:
So vergleichen Sie zwei Zweige:
quelle
Ich benutze dieses Bit schon
~/.gitconfig
lange:Mit
git-meld
:Aber jetzt habe ich es satt, in einer grafischen Umgebung immer meld zu verwenden, und es ist nicht trivial, mit diesem Setup den normalen Diff aufzurufen, also habe ich zu folgendem gewechselt:
Mit diesem Setup funktionieren solche Dinge:
Und ich kann immer noch das Gute alt halten
git diff
.quelle
Wenn Sie bereits ein Diff-Tool für Dateitypen haben (z. B. weil Sie TortoiseSVN installiert haben, das mit einem Diff-Viewer geliefert wird), können Sie die reguläre
git diff
Ausgabe einfach an eine "temporäre" Datei weiterleiten und diese Datei dann direkt öffnen, ohne es zu wissen alles über den Betrachter:Das Festlegen als globaler Alias funktioniert noch besser:
git what
quelle
Wenn Sie nicht für die Befehlszeile zuständig sind, können Sie bei der Installation von tortoise git mit der rechten Maustaste auf eine Datei klicken, um ein Tortoisegit-Untermenü mit der Option "Diff later" aufzurufen.
Wenn Sie dies in der ersten Datei auswählen, können Sie mit der rechten Maustaste auf die zweite Datei klicken, zum Untermenü "Tortoisegit" gehen und "Diff with == yourfilehere ==" auswählen. Dadurch wird die Tortoisegitmerge-GUI für das Ergebnis angezeigt.
quelle
Vielleicht möchten Sie xd http://github.com/jiqingtang/xd ausprobieren, einen GUI-Wrapper für GIT / SVN diff. Es ist KEIN Diff-Tool. Sie laufen,
xd
wenn Sie laufen wollengit diff
odersvn diff
und es wird Ihnen eine Liste von Dateien zeigen, ein Vorschaufenster und Sie können jede Diff - Tool starten Sie so wollen, einschließlich tkdiff, xxdiff, gvimdiff, Emacs (ediff), xemacs (ediff), meld, diffuse, kompare und kdiff3. Sie können auch ein beliebiges benutzerdefiniertes Tool ausführen.Leider unterstützt das Tool Windows nicht.
Offenlegung : Ich bin der Autor dieses Tools.
quelle