Jak wyświetlić wyjście „git diff” za pomocą mojego preferowanego narzędzia / przeglądarki diff?


754

Kiedy piszę git diff, chcę wyświetlić wynik za pomocą wybranego narzędzia wizualnego porównywania (SourceGear „diffmerge” w systemie Windows). Jak skonfigurować Git, aby to zrobić?


108
Możesz używać „git difftool” zamiast „git diff” we wszystkich nowszych wersjach git. To otworzy wizualny program do różnicowania.
PlagueHammer

Jeśli chodzi o nowy skrypt difftool, dodałem odpowiedź poniżej: stackoverflow.com/questions/255202/…
VonC

2
gitx - gitx.frim.nl . Powiedział Nuff.
Alex Grande,

1
Krótki tutorial, który znajdziesz tutaj: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
Dmitry Bespalov

5
Przejdź do swojego repozytorium w Git Bash. Wpisz git config diff.tool winmerge. Sprawdź, czy zadziałało, pisząc git difftool. Pozbądź się szybkiego pisania git config --global difftool.prompt false. Polecam p4merge zamiast winmerge.
Michael S.

Odpowiedzi:


386

Od wersji Git 1.6.3 możesz używać skryptu git difftool : patrz moja odpowiedź poniżej .


Być może ten artykuł pomoże ci. Oto najlepsze części:

Istnieją dwa różne sposoby określania zewnętrznego narzędzia porównywania.

Pierwszą jest zastosowana metoda, poprzez ustawienie zmiennej GIT_EXTERNAL_DIFF. Jednak zmienna ma wskazywać pełną ścieżkę pliku wykonywalnego. Ponadto plik wykonywalny określony przez GIT_EXTERNAL_DIFF będzie wywoływany ze stałym zestawem 7 argumentów:

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

Ponieważ większość narzędzi do porównywania będzie wymagała innej kolejności (i tylko niektórych) argumentów, najprawdopodobniej będziesz musiał podać skrypt otoki, który z kolei wywołuje prawdziwe narzędzie do porównywania.

Druga metoda, którą preferuję, to konfiguracja zewnętrznego narzędzia do porównywania za pomocą „git config” . Oto co zrobiłem:

1) Utwórz skrypt otoki „git-diff-wrapper.sh”, który zawiera coś podobnego

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

Jak widać, tylko drugi („stary plik”) i piąty („nowy plik”) zostaną przekazane do narzędzia różnicowego.

2) Rodzaj

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

w wierszu polecenia, zastępując ścieżkę do „git-diff-wrapper.sh”, więc plik ~ / .gitconfig zawiera

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

Upewnij się, że używasz poprawnej składni, aby określić ścieżki do skryptu opakowania i narzędzia różnicowego, tj. Użyj ukośników zamiast ukośników odwrotnych. W moim przypadku mam

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

w .gitconfig i

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

w skrypcie opakowania. Uważaj na zwisającego „kota”!

(Przypuszczam, że „| cat ” jest potrzebne tylko w przypadku niektórych programów, które mogą nie zwracać prawidłowego lub spójnego statusu powrotu. Możesz spróbować bez kota końcowego, jeśli twoje narzędzie różnicowania ma jawny status zwrotu)

( Diomidis Spinellis dodaje w komentarzach :

catWymagana jest komenda, ponieważ diff(1)domyślnie wyjść z kodem błędu, jeśli pliki różnią.
Git oczekuje, że zewnętrzny program diff zakończy działanie z kodem błędu tylko wtedy, gdy wystąpił rzeczywisty błąd, np. Gdy zabraknie mu pamięci.
Przez potokowanie wyjście gitdo catniezerowego kodu błędu jest maskowane.
Bardziej wydajnie, program mógłby po prostu działać exitz argumentem 0.)


To (artykuł cytowany powyżej) jest teorią dla zewnętrznego narzędzia zdefiniowanego przez plik konfiguracyjny (a nie zmienną środowiskową).
W praktyce (wciąż w przypadku definicji pliku konfiguracyjnego narzędzia zewnętrznego) możesz odwoływać się do:


1
ah, ustawiłem zewnętrzny program różnicowy, ale nie wiedziałem o 7 argumentach, dzięki.
user3891,

4
Kudos ... to jest bardzo przydatne. Skonfigurowałem to za pomocą „opendiff” (który uruchamia narzędzie XCode FileMerge pod Mac OS X).
Ryan Delucchi,

@ Ryan: to świetnie :) Czy użyłeś ustawienia „diff.external” opisanego w tej odpowiedzi lub „git difftool” mojej drugiej odpowiedzi poniżej?
VonC

Fantastyczny! Dziękuję, wypróbowałem zarówno DiffMerge, jak i opendiff; oba działają całkiem dobrze.
vfilby

2
Więc git wysyła 7 argumentów do programu różnicowego? Im więcej dowiaduję się o Git, tym bardziej wydaje mi się, że został stworzony dla jednej osoby: oryginalnego programisty. Ten dvcs wydaje się bardziej błyszczącą zabawką, która niewiele robi.
C Johnson,

211

Aby uzupełnić moją poprzednią odpowiedź konfiguracyjną „diff.external” powyżej:

Jak wspomniał Jakub , Git 1.6.3 wprowadził git difftool , pierwotnie zaproponowany we wrześniu 2008 roku:

USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Zobacz --extcmdw ostatniej części tej odpowiedzi)

$LOCAL zawiera zawartość pliku z początkowej wersji i $REMOTE zawiera zawartość pliku w wersji końcowej.
$BASEzawiera zawartość pliku w wor

Jest zasadniczo git-mergetoolzmodyfikowany do działania na indeksie / drzewie roboczym git.

Sprawa stosowanie zwykle dla tego skryptu jest, gdy masz albo tymczasowe lub Unstaged zmiany i chcesz, aby zobaczyć zmiany w przeglądarce side-by-side (np diff xxdiff, tkdiffitp).

git difftool [<filename>*]

Innym przypadkiem użycia jest to, że chcesz zobaczyć te same informacje, ale porównujesz arbitralne zatwierdzenia (jest to część, w której parsowanie rewarg może być lepsze)

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

Ostatni przypadek użycia ma miejsce, gdy chcesz porównać swój obecny zestaw roboczy z czymś innym niż HEAD (np. Tag)

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

Uwaga: od wersji Git 2.5 git config diff.tool winmergewystarczy!
Zobacz „ git Combetool Winmerge

A od wersji Git 1.7.11 masz taką opcję--dir-diff , aby spawnować zewnętrzne narzędzia porównywania, które mogą porównywać dwie hierarchie katalogów jednocześnie po zapełnieniu dwóch katalogów tymczasowych, zamiast uruchamiać instancję narzędzia zewnętrznego raz na parę plików.


Przed Git 2.5:

Praktyczny przypadek konfiguracji za difftoolpomocą niestandardowego narzędzia do porównywania:

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

Dzięki winmerge.sh zapisanemu w części katalogu ŚCIEŻKI:

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

Jeśli masz inne narzędzie (kdiff3, P4Diff, ...), utwórz kolejny skrypt powłoki i odpowiednią difftool.myDiffTool.cmddyrektywę konfiguracji.
Następnie możesz łatwo przełączać narzędzia za pomocądiff.tool config.

Masz również ten wpis na blogu autorstwa Dave'a, aby dodać inne szczegóły.
(Lub to pytanie dowinmergeu opcji)

Zainteresowaniem tym ustawieniem jest winmerge.shskrypt : możesz go dostosować, aby uwzględnić specjalne przypadki.

Patrz na przykład David Marble „s odpowiedź poniżej dla przykładu, który zajmuje się:

  • nowe pliki pochodzenia lub przeznaczenia
  • usunięto pliki w miejscu początkowym lub docelowym

Jak Kem Mason wspomina w swojej odpowiedzi , możesz również uniknąć dowolnego opakowania, korzystając z --extcmdopcji :

--extcmd=<command>

Podaj niestandardowe polecenie wyświetlania różnic. git-difftoolignoruje skonfigurowane wartości domyślne i działa, $command $LOCAL $REMOTEgdy ta opcja jest określona.

Na przykład w ten sposób gitkmożna uruchomić / użyć dowolnego diffnarzędzia .


11
Musiałem uciec z $, za $ LOCAL i $ REMOTE, aby nie stały się one „” i „”. Chciałbym edytować, aby powiedzieć git config --globla difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" \ $ REMOTE \ ""
Carlos Rendon

A także jakiś pomysł, jak uzyskać opcję -s (otwórz kilka różnic w jednym oknie winmerge) do pracy w tym schemacie?
Carlos Rendon,

1
@Carlos: Frank (patrz komentarz powyżej) chciał, abyś spojrzał na stackoverflow.com/questions/1220309/... (za otwarcie kilku różnic w jednym oknie winmerge)
VonC

1
Te --start=i --end=opcje nie są rozpoznawane w v1.7.11
Michael

1
@ SteveChambers Tak, wspomniałem o tym w stackoverflow.com/a/10879804/6309 . Zmienię tę odpowiedź.
VonC

110

W duchu odpowiadania na pytania nieco inne niż zadawane. Wypróbuj to rozwiązanie:

$ meld my_project_using_git

Meld rozumie git i zapewnia nawigację po ostatnich zmianach.


17
To wspaniale, o wiele łatwiejsze do wpisania meld .niż git difftooli trzeba kolejno przeglądać zmienione pliki. I jest znacznie bliżej hg vdiffwtyczki Mercurial .
Tom

6
Ponadto meld .pracuje nad projektami Mercurial i Subversion też, w przypadku gdy ktoś jest ciekawy.
Tom

Hmm, kiedy to robię, pokazuje listę zmodyfikowanych plików. Kiedy kliknę jeden z nich lub dokonam „porównania”, otwiera się sam w osobnej zakładce. Jak uzyskać różnicę?
misiu_mp,

@ misiu_mp, właśnie spróbowałem, po kliknięciu zmodyfikowanych plików, pokazuje różnicę (stary plik i zmodyfikowany plik).
db42

W jakiej wersji została dodana? Nie działa z wersją meld 1.1.5.
Mark Booth,

41

Z nowym git difftool jest to tak proste, jak dodanie tego do pliku .gitconfig :

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

Opcjonalnie dodaj także:

[difftool]
    prompt = false

Zobacz także diffall , prosty skrypt, który napisałem, aby rozszerzyć irytujące (IMO) domyślne zachowanie diff podczas otwierania każdego z nich szeregowo.

Globalny .gitconfig w systemie Windows jest włączony %USERPROFILE%\.gitconfig


1
co to jest $ local, a co $ remote?
C Johnson,

3
+1 za metodę, która nie wymaga skryptu opakowania
jhewlett

@CJohnson: Odpowiednio ścieżka do oryginalnego pliku i ścieżka do edytowanego pliku.
jhewlett

na wypadek gdyby link do blogu umarł, oto linkowana odpowiedź SO: stackoverflow.com/a/1291578/321973
Tobias Kienzler

1
@CJohnson: $ LOCAL jest zawsze ostatnim zatwierdzeniem. Jednak $ REMOTE nie jest spójny. Gdy patrzysz na zmiany w lokalnym obszarze izolowanym, jest to plik bieżący / edytowany, ale gdy różnicujesz historyczne zatwierdzenia, jest to zatwierdzenie nadrzędne . IOW dla normalnych różnic $ LOCAL = stary i $ REMOTE = nowy. Dla historycznych $ LOCAL = nowszy i $ REMOTE = starszy.
Granger,

40

Od wersji 1.6.3 git istnieje „ git difftool ”, który możesz skonfigurować tak, aby używał twojego ulubionego graficznego narzędzia do porównywania. Obecnie obsługiwane są gotowe kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse i opendiff ; jeśli narzędzia, którego chcesz użyć, nie ma na tej liście, zawsze możesz użyć difftool.<tool>.cmdopcji konfiguracji.

„git difftool” akceptuje te same opcje co „git diff”.


1
Araxis Merge jest również skonfigurowany. araxis.com/merge/scm_integration.html
ΩmegaMan

8
przykładowe użycie:git difftool -t kdiff3 HEAD
emanaton

24

Mam do tego jeden dodatek. Lubię regularnie używać aplikacji diff, która nie jest obsługiwana jako jedno z domyślnych narzędzi (np. Kalejdoskop), za pośrednictwem

git difftool -t

Lubię też, aby domyślną diffbyła zwykła linia poleceń, więc ustawienie GIT_EXTERNAL_DIFFzmiennej nie jest opcją.

Możesz użyć dowolnej diffaplikacji jako jednorazowej komendy:

git difftool --extcmd=/usr/bin/ksdiff

Po prostu przekazuje 2 pliki do określonego polecenia, więc prawdopodobnie nie potrzebujesz również opakowania.


1
Dobra uwaga: nikt jeszcze nie wspomniał o tej --extcmdopcji. +1. Zawarłem to w mojej odpowiedzi.
VCC

19

Opierając się na odpowiedzi VonC dotyczącej usuwania i dodawania plików, użyj następujących poleceń i skryptów:

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

To jest to samo, co umieszczenie tego w swoim globalnym .gitconfig:

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

Następnie umieść następujące, winmerge.shktóre muszą być na twojej drodze:

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

Doskonały dodatek do winmerge.shskryptu. +1. Zaktualizowałem moją odpowiedź, aby połączyć się z Twoją.
VonC

1
winmerge.batw drugim fragmencie powinien byćwinmerge.sh
BartoszKP

Czy potrafisz to zrobić dla wielu narzędzi? I skojarzyć je według rozszerzenia pliku?
yucer

12

Rozwiązanie dla Windows / msys git

Po przeczytaniu odpowiedzi odkryłem prostszy sposób, który polega na zmianie tylko jednego pliku.

  1. Utwórz plik wsadowy, aby wywołać program diff, z argumentami 2 i 5. Ten plik musi znajdować się gdzieś na twojej ścieżce. (Jeśli nie wiesz, gdzie to jest, wstaw to do c: \ windows). Nazwij to na przykład „gitdiff.bat”. Mój jest:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. Ustaw zmienną środowiskową, aby wskazywała na plik wsadowy. Na przykład: GIT_EXTERNAL_DIFF=gitdiff.bat. Lub poprzez PowerShell, piszącgit config --global diff.external gitdiff.bat .

    Ważne jest, aby nie używać cudzysłowów ani podawać żadnych informacji o ścieżce, w przeciwnym razie nie zadziała. Właśnie dlatego gitdiff.bat musi być na twojej drodze.

Teraz, gdy wpiszesz „git diff”, uruchomi się twoja zewnętrzna przeglądarka diff.


1
+1 (+10, gdybym mógł). To naprawdę najprostsze rozwiązanie. Godzinami walczyłem z zaakceptowaną odpowiedzią i ostatecznie się poddałem (niektóre z moich problemów były prawdopodobnie związane z uruchomieniem Git przez PowerShell ...) Jednak użyłem git config --global diff.external winmerge.cmdzamiast ustawiać GIT_EXTERNAL_DIFFzmienną środowiskową i działa ona równie dobrze.
Christoffer Lette,

Kilka problemów z tym rozwiązaniem: 1. Nie działa dla nowych plików. WinMerge prosi mnie o wprowadzenie drugiego pliku do porównania. 2. Okno do porównania następnego pliku otwiera się dopiero po zamknięciu bieżącego okna WinMerge, co nie jest łatwym sposobem na zobaczenie wszystkich plików jednocześnie.
Jezus H

9

Jeśli robisz to przez cygwin, być może będziesz musiał użyć cygpath :

$ 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`

Z jakiegoś powodu używanie „bc3” nie działa już dla mnie, ale jeśli zamiast tego użyję „poza”, jest w porządku.
idbrii

9

Po przyjrzeniu się innym zewnętrznym narzędziom do porównywania zauważyłem, że diffwidok w IntelliJ IDEA (i Android Studio) jest dla mnie najlepszy.

Krok 1 - skonfiguruj IntelliJ IDEA do uruchomienia z wiersza poleceń

Jeśli chcesz używać IntelliJ IDEA jako narzędzia do porównywania, najpierw skonfiguruj IntelliJ IDEA do uruchamiania z wiersza poleceń, postępując zgodnie z instrukcjami tutaj :

W systemie macOS lub UNIX:

  1. Upewnij się, że IntelliJ IDEA działa.
  2. W menu głównym wybierz Tools | Create Command-line Launcher. Zostanie otwarte okno dialogowe Utwórz skrypt uruchamiania z sugerowaną ścieżką i nazwą skryptu uruchamiania. Możesz zaakceptować wartość domyślną lub określić własną ścieżkę. Zwróć na to uwagę, ponieważ będziesz go później potrzebować. Poza IntelliJ IDEA dodaj ścieżkę i nazwę skryptu uruchamiania do swojej ścieżki.

W systemie Windows:

  1. Określ lokalizację pliku wykonywalnego IntelliJ IDEA w zmiennej środowiskowej systemu Path. W takim przypadku będziesz mógł wywołać plik wykonywalny IntelliJ IDEA i inne komendy IntelliJ IDEA z dowolnego katalogu.

Krok 2 - Skonfiguruj git, aby używał IntelliJ IDEA jako difftool

Postępując zgodnie z instrukcjami w tym poście na blogu :

Grzmotnąć

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

Ryba

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

Teraz dodaj do konfiguracji git:

[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")

Możesz to wypróbować za pomocą git difftoollubgit difftool HEAD~1


8

to działa dla mnie w systemie Windows 7. Nie potrzeba pośrednich skryptów sh

zawartość .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"

Czy masz także kdiff3 zdefiniowane jako narzędzie do łączenia? Możesz podzielić się tą częścią swojego gitconfig, jeśli tak?
blong

2
Dzięki. To nie do końca działało, ale zadziałało, kiedy usunąłem pathi zmieniłem cmdna"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Steve Chambers

7

Krótkie streszczenie powyższych świetnych odpowiedzi:

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

Następnie użyj go, wpisując (opcjonalnie podając także nazwę pliku):

git difftool

6

Wprowadzenie

W celach informacyjnych chciałbym dołączyć moją odmianę odpowiedzi VonC. Należy pamiętać, że używam wersji MSys Git (obecnie 1.6.0.2) ze zmodyfikowaną PATH i uruchamiam samą Git z Powershell (lub cmd.exe), a nie z powłoki Bash.

I wprowadził nową komendę gitdiff. Uruchomienie tego polecenia tymczasowo przekierowuje, git diffaby użyć wybranego programu do wizualnego porównywania (w przeciwieństwie do rozwiązania VonC, które robi to na stałe). To pozwala mi mieć zarówno domyślną funkcję Git diff ( git diff), jak i wizualną funkcję diff ( gitdiff). Oba polecenia przyjmują te same parametry, więc na przykład wizualnie różnicują zmiany w określonym pliku, który można wpisać

gitdiff path/file.txt

Ustawiać

Zauważ, że $GitInstalljest używany jako symbol zastępczy katalogu, w którym zainstalowany jest Git.

  1. Utwórz nowy plik, $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. Utwórz nowy plik $GitInstall\bin\git-diff-visual.cmd(zastępując [visual_diff_exe]symbol zastępczy pełną ścieżką do wybranego programu różnicowego)

    @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. Już skończyłeś. Uruchamianie gitdiffz repozytorium Git powinno teraz wywoływać program Visual Diff dla każdego pliku, który został zmieniony.


6

Oto plik wsadowy, który działa w systemie Windows - zakłada, że ​​DiffMerge jest zainstalowany w domyślnej lokalizacji, obsługuje x64, w razie potrzeby obsługuje zmianę do przodu na odwrotny ukośnik i ma możliwość samodzielnej instalacji. Powinno być łatwo zastąpić DiffMerge ulubionym programem różnicowym.

Żeby zainstalować:

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

Świetny skrypt, oszczędził mi kłopotów z szukaniem poleceń DiffMerge. Możesz zmodyfikować linię instalacyjną, aby używać cudzysłowów - miałem problem na moim komputerze: „% 1” == ”- zainstaluj”.
Mario

6

Jeśli korzystasz z komputera Mac i masz XCode, masz zainstalowaną FileMerge. Polecenie terminalu jest opendiff, więc możesz to zrobićgit difftool -t opendiff


2
Użyj opcji -y, aby uniknąć irytujących monitów. Niestety, git poczeka na zakończenie FileMerge, zanim zaoferuje następny zmieniony plik. Użyj opcji -d, aby porównać katalog w jednym ujęciu.
miner49r

Opcja -t wydaje się wymagać pełnej ścieżki. Może lepsze jest użycie git difftool --extcmd = opendiff.
yucer

6

Zainstaluj meld

 # apt-get install meld

Następnie wybierz to jako difftool

 $ git config --global diff.tool meld

Jeśli chcesz go uruchomić na konsoli:

 $ git difftool

Jeśli chcesz użyć trybu graficznego:

 $ git mergetool

I wynik byłby:

 '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):

Więc wciśnij enter, aby użyć meldowania (domyślnie), otworzy to tryb graficzny, magia zapisze i naciśnij, aby rozwiązać scalenie. To wszystko


5

W przypadku wersji linuksowej dotyczącej konfigurowania narzędzia różnicowego w wersjach git wcześniejszych niż 1.6.3 (1.6.3 dodano difftool do git) to jest to świetny poradnik zwięzłe,

w skrócie:

Krok 1: Dodaj to do .gitconfig

[diff]
  external = git_diff_wrapper
[pager]
  diff =

Krok 2: utwórz plik o nazwie git_diff_wrapper, umieść go gdzieś w zmiennej $ PATH

#!/bin/sh

vimdiff "$2" "$5"

4

W systemie Mac OS X

git difftool -t diffuse 

wykonuje dla mnie zadanie w folderze git. Do instalacji rozproszonego można użyć portu -

sudo port install diffuse

3

możesz użyć git difftool .

na przykład, jeśli masz połączenie , możesz edytować gałęzie masteri devel:

git config --global diff.external meld
git difftool master..devel

3

Poniższe odpowiedzi można znaleźć na podstawie innych odpowiedzi tutaj, ale dla mnie jest to trudne (zbyt wiele informacji), więc oto odpowiedź „po prostu wpisz” dla tkdiff:

git difftool --tool=tkdiff <path to the file to be diffed>

Możesz zastąpić nazwę pliku wykonywalnego swojego ulubionego narzędzia różnicującego przez tkdiff. Tak długo, jak (np. Tkdiff), (lub twoje ulubione narzędzie różnicowania) znajduje się w ŚCIEŻCE, zostanie uruchomione.


to jest najprostszy i najszybszy sposób.
Zameer Fouzan

2

Próbowałem tutaj fantazyjnych rzeczy (z tkdiff) i nic nie działało dla mnie. Napisałem więc następujący skrypt, tkgitdiff. Robi to, czego potrzebuję.

$ 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

1

Używam kompare na Ubuntu:

sudo apt-get install kompare

Aby porównać dwie gałęzie:

git difftool -t kompare <my_branch> master

1

Używam tego bitu ~/.gitconfigod dłuższego czasu:

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

Z git-meld:

#!/bin/bash
if [ "$DISPLAY" = "" ];
then
    diff $2 $5
else
    meld $2 $5
fi

Ale teraz mam już dość używania meldowania w środowisku graficznym i nie jest trywialne wywoływanie normalnego diff przy tej konfiguracji, więc przełączyłem się na:

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

W tej konfiguracji takie rzeczy działają:

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

I nadal mogę zachować dobre stare git diff.


0

Jeśli zdarzyło Ci się już mieć narzędzie różnicujące powiązane z typami plików (powiedzmy, ponieważ zainstalowałeś TortoiseSVN, który jest wyposażony w przeglądarkę różnic), możesz po prostu git diffprzesłać zwykłe wyjście do pliku „temp”, a następnie po prostu otworzyć ten plik bezpośrednio, bez potrzeby cokolwiek o widzu:

git diff > "~/temp.diff" && start "~/temp.diff"

Ustawienie go jako globalnego aliasu działa jeszcze lepiej: git what

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

0

Jeśli nie jesteś jednym z wiersza poleceń, to jeśli zainstalujesz żółwia, możesz kliknąć plik prawym przyciskiem myszy, aby uzyskać podmenu żółwia z opcją „Zróżnicuj później”.

Kiedy wybierzesz to w pierwszym pliku, możesz następnie kliknąć prawym przyciskiem myszy drugi plik, przejść do podmenu tortoisegit i wybrać „Zróżnicuj == yourfilehere ==” To da gui tortoisegitmerge dla wyniku.


0

Możesz wypróbować xd http://github.com/jiqingtang/xd , który jest opakowaniem GUI dla różnic GIT / SVN. To NIE jest samo narzędzie do porównywania. Biegniesz, xdkiedy chcesz uruchomić git difflubsvn diff i to pokazuje listę plików, okno podglądu i można uruchomić dowolne narzędzie diff chcesz, włącznie tkdiff, xxdiff, gvimdiff, Emacs (ediff) xemacs (ediff) Meld, diffuse, kompare i kdiff3. Możesz także uruchomić dowolne niestandardowe narzędzie.

Niestety narzędzie nie obsługuje systemu Windows.

Ujawnienie : Jestem autorem tego narzędzia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.