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?

user3891
quelle
108
Sie können "git difftool" anstelle von "git diff" in allen neueren Versionen von git verwenden. Das öffnet ein visuelles Diff-Programm.
PlagueHammer
In Bezug auf das neue Skriptdifftool habe ich unten eine Antwort hinzugefügt: stackoverflow.com/questions/255202/…
VonC
2
GitX - gitx.frim.nl . Sagte Nuff.
Alex Grande
1
Kurzes Tutorial finden Sie hier: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
Dmitry Bespalov
5
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:

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 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.

2) Typ

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

Ersetzen Sie an der Eingabeaufforderung durch den Pfad zu "git-diff-wrapper.sh", damit Ihre ~ / .gitconfig 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-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\"

in .gitconfig und

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

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 :

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:

VonC
quelle
1
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.
C Johnson
211

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 --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).

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 winmergeist 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 difftoolmit Ihrem benutzerdefinierten Diff-Tool:

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

Mit winmerge.sh in einem Verzeichnis Ihres PATH gespeichert:

#!/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 anderes Shell-Skript und die entsprechende difftool.myDiffTool.cmdKonfigurationsanweisung.
Dann können Sie mit der diff.toolKonfiguration einfach die Werkzeuge wechseln .

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

Das Interesse an dieser Einstellung ist das winmerge.shSkript : 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:

  • neue Dateien entweder im Ursprung oder im Ziel
  • entfernte Dateien entweder im Ursprung oder im Ziel

Wie Kem Mason in seiner Antwort erwähnt , können Sie auch Wrapper vermeiden, indem Sie die --extcmdOption verwenden :

--extcmd=<command>

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.

Auf diese Weise kann gitkbeispielsweise ein beliebiges diffTool ausgeführt / verwendet werden .

VonC
quelle
11
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?
Carlos Rendon
1
@ Carlos: Frank (siehe Kommentar oben) wollte, dass Sie sich stackoverflow.com/questions/1220309/… ansehen (um mehrere Unterschiede in einem Winmerge-Fenster zu öffnen)
VonC
1
Die --start=und --end=Optionen werden in v1.7.11
Michael
1
@SteveChambers Ja, ich habe es in stackoverflow.com/a/10879804/6309 erwähnt . Ich werde diese Antwort bearbeiten.
VonC
110

Im Sinne der Beantwortung von Fragen, die etwas anders sind als gestellt. Versuchen Sie diese Lösung:

$ meld my_project_using_git

Meld versteht Git und bietet die Navigation zu den letzten Änderungen.

Charles Merriam
quelle
17
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:

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

Optional können Sie auch Folgendes hinzufügen:

[difftool]
    prompt = false

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

Seba Illingworth
quelle
1
Was ist $ local und was ist $ remote?
C Johnson
3
+1 für eine Methode, die kein Wrapper-Skript benötigt
jhewlett
@CJohnson: Pfad zur Originaldatei bzw. Pfad zur bearbeiteten Datei.
Jhewlett
Für den Fall, dass der Blog-Link stirbt, hier ist die verknüpfte SO-Antwort: stackoverflow.com/a/1291578/321973
Tobias Kienzler
1
@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".

Jakub Narębski
quelle
1
Araxis Merge ist ebenfalls konfiguriert. araxis.com/merge/scm_integration.html
ΩmegaMan
8
Beispiel Verwendung:git difftool -t kdiff3 HEAD
Emanaton
24

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.

Kem Mason
quelle
1
Guter Punkt: Niemand hat diese --extcmdOption bisher erwähnt . +1. Ich habe es in meine Antwort aufgenommen.
VonC
19

Verwenden Sie die folgenden Befehle und Skripte, um auf der Antwort von VonC zum Entfernen und Hinzufügen von Dateien aufzubauen:

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

Welches ist das gleiche wie dies in Ihre globale setzen .gitconfig:

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
    prompt = false

Setzen Sie dann Folgendes ein, winmerge.shdas sich auf Ihrem Weg befinden muss:

#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
    echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
    echo "added: $3"
else
    echo "changed: $3"
    "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi
David Marble
quelle
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.

  1. 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
    
  2. 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.

Steve Hanov
quelle
1
+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 :

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`
idbrii
quelle
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:

  1. Stellen Sie sicher, dass IntelliJ IDEA ausgeführt wird.
  2. 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:

  1. 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

Befolgen Sie die Anweisungen in diesem Blog-Beitrag :

Bash

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

Fisch

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

Fügen Sie nun Ihrer Git-Konfiguration Folgendes hinzu:

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

Sie können es mit git difftooloder ausprobierengit difftool HEAD~1

David Rawson
quelle
8

Dies funktioniert für mich unter Windows 7. Es sind keine zwischengeschalteten Skripte erforderlich

Inhalt von .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"
Scharia
quelle
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:

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

Verwenden Sie es dann durch Eingabe (optional auch unter Angabe des Dateinamens):

git difftool

quelle
6

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ü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.

  1. 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
    
  2. 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
    
  3. Du bist jetzt fertig. Das Ausführen gitdiffaus einem Git-Repository sollte jetzt Ihr Visual Diff-Programm für jede geänderte Datei aufrufen.

Milan Gardian
quelle
6

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
Brad Robinson
quelle
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

Luxusmodus
quelle
2
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

GI Joe
quelle
5

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

#!/bin/sh

vimdiff "$2" "$5"
Feuerkrähe
quelle
4

Unter Mac OS X

git difftool -t diffuse 

erledigt den Job für mich im Git-Ordner. Für die Installation von diffus kann man port - verwenden

sudo port install diffuse
Shreyas
quelle
3

Sie können verwenden git difftool.

wenn Sie zum Beispiel hat meld , können Sie die branchs bearbeiten masterund develdurch:

git config --global diff.external meld
git difftool master..devel
suhailvs
quelle
3

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.

dolphus333
quelle
Dies ist der einfachste und schnellste Weg.
Zameer Fouzan
2

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
Theodore Sternberg
quelle
1

Ich benutze kompare auf Ubuntu:

sudo apt-get install kompare

So vergleichen Sie zwei Zweige:

git difftool -t kompare <my_branch> master
Bilal und Olga
quelle
1

Ich benutze dieses Bit schon ~/.gitconfiglange:

[diff]
    external = ~/Dropbox/source/bash/git-meld

Mit git-meld:

#!/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:

[alias]
    v =  "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"

Mit diesem Setup funktionieren solche Dinge:

git v
git v --staged
git v -t kompare
git v --staged -t tkdiff

Und ich kann immer noch das Gute alt halten git diff.

abo-abo
quelle
0

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

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"
drzaus
quelle
0

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.

Camjocotem
quelle
0

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.

Leider unterstützt das Tool Windows nicht.

Offenlegung : Ich bin der Autor dieses Tools.

Jiqing Tang
quelle