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ć?
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:
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.
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 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)
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:
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.
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)
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:
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.
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.
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
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 :
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
@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”.
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.
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.
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
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 (+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 :
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:
Upewnij się, że IntelliJ IDEA działa.
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:
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
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\""
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.
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
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
Już skończyłeś. Uruchamianie gitdiffz repozytorium Git powinno teraz wywoływać program Visual Diff dla każdego pliku, który został zmieniony.
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
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
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
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.
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
#!/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:
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
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.
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.
git config diff.tool winmerge
. Sprawdź, czy zadziałało, piszącgit difftool
. Pozbądź się szybkiego pisaniagit config --global difftool.prompt false
. Polecam p4merge zamiast winmerge.Odpowiedzi:
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:
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
Jak widać, tylko drugi („stary plik”) i piąty („nowy plik”) zostaną przekazane do narzędzia różnicowego.
2) Rodzaj
w wierszu polecenia, zastępując ścieżkę do „git-diff-wrapper.sh”, więc plik ~ / .gitconfig zawiera
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
w .gitconfig i
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 :
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:
źródło
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
--extcmd
w ostatniej części tej odpowiedzi)$LOCAL
zawiera zawartość pliku z początkowej wersji i$REMOTE
zawiera zawartość pliku w wersji końcowej.$BASE
zawiera zawartość pliku w worOstatni przypadek użycia ma miejsce, gdy chcesz porównać swój obecny zestaw roboczy z czymś innym niż HEAD (np. Tag)
Uwaga: od wersji Git 2.5
git config diff.tool winmerge
wystarczy!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
difftool
pomocą niestandardowego narzędzia do porównywania:Dzięki winmerge.sh zapisanemu w części katalogu ŚCIEŻKI:
Jeśli masz inne narzędzie (kdiff3, P4Diff, ...), utwórz kolejny skrypt powłoki i odpowiednią
difftool.myDiffTool.cmd
dyrektywę 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 do
winmergeu
opcji)Zainteresowaniem tym ustawieniem jest
winmerge.sh
skrypt : 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ę:
Jak Kem Mason wspomina w swojej odpowiedzi , możesz również uniknąć dowolnego opakowania, korzystając z
--extcmd
opcji :Na przykład w ten sposób
gitk
można uruchomić / użyć dowolnegodiff
narzędzia .źródło
--start=
i--end=
opcje nie są rozpoznawane w v1.7.11W duchu odpowiadania na pytania nieco inne niż zadawane. Wypróbuj to rozwiązanie:
Meld rozumie git i zapewnia nawigację po ostatnich zmianach.
źródło
meld .
niżgit difftool
i trzeba kolejno przeglądać zmienione pliki. I jest znacznie bliżejhg vdiff
wtyczki Mercurial .meld .
pracuje nad projektami Mercurial i Subversion też, w przypadku gdy ktoś jest ciekawy.1.1.5
.Z nowym git difftool jest to tak proste, jak dodanie tego do pliku .gitconfig :
Opcjonalnie dodaj także:
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
źródło
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>.cmd
opcji konfiguracji.„git difftool” akceptuje te same opcje co „git diff”.
źródło
git difftool -t kdiff3 HEAD
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
Lubię też, aby domyślną
diff
była zwykła linia poleceń, więc ustawienieGIT_EXTERNAL_DIFF
zmiennej nie jest opcją.Możesz użyć dowolnej
diff
aplikacji jako jednorazowej komendy:Po prostu przekazuje 2 pliki do określonego polecenia, więc prawdopodobnie nie potrzebujesz również opakowania.
źródło
--extcmd
opcji. +1. Zawarłem to w mojej odpowiedzi.Opierając się na odpowiedzi VonC dotyczącej usuwania i dodawania plików, użyj następujących poleceń i skryptów:
To jest to samo, co umieszczenie tego w swoim globalnym
.gitconfig
:Następnie umieść następujące,
winmerge.sh
które muszą być na twojej drodze:źródło
winmerge.sh
skryptu. +1. Zaktualizowałem moją odpowiedź, aby połączyć się z Twoją.winmerge.bat
w drugim fragmencie powinien byćwinmerge.sh
Rozwiązanie dla Windows / msys git
Po przeczytaniu odpowiedzi odkryłem prostszy sposób, który polega na zmianie tylko jednego pliku.
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:
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.
źródło
git config --global diff.external winmerge.cmd
zamiast ustawiaćGIT_EXTERNAL_DIFF
zmienną środowiskową i działa ona równie dobrze.Jeśli robisz to przez cygwin, być może będziesz musiał użyć cygpath :
źródło
Po przyjrzeniu się innym zewnętrznym narzędziom do porównywania zauważyłem, że
diff
widok 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:
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:
Krok 2 - Skonfiguruj git, aby używał IntelliJ IDEA jako difftool
Postępując zgodnie z instrukcjami w tym poście na blogu :
Grzmotnąć
Ryba
Teraz dodaj do konfiguracji git:
Możesz to wypróbować za pomocą
git difftool
lubgit difftool HEAD~1
źródło
to działa dla mnie w systemie Windows 7. Nie potrzeba pośrednich skryptów sh
zawartość .gitconfig:
źródło
path
i zmieniłemcmd
na"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Krótkie streszczenie powyższych świetnych odpowiedzi:
Następnie użyj go, wpisując (opcjonalnie podając także nazwę pliku):
źródło
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 diff
aby 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ćUstawiać
Zauważ, że
$GitInstall
jest używany jako symbol zastępczy katalogu, w którym zainstalowany jest Git.Utwórz nowy plik,
$GitInstall\cmd\gitdiff.cmd
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)Już skończyłeś. Uruchamianie
gitdiff
z repozytorium Git powinno teraz wywoływać program Visual Diff dla każdego pliku, który został zmieniony.źródło
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.bat:
źródło
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
źródło
Zainstaluj meld
Następnie wybierz to jako difftool
Jeśli chcesz go uruchomić na konsoli:
Jeśli chcesz użyć trybu graficznego:
I wynik byłby:
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
źródło
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
Krok 2: utwórz plik o nazwie git_diff_wrapper, umieść go gdzieś w zmiennej $ PATH
źródło
W systemie Mac OS X
wykonuje dla mnie zadanie w folderze git. Do instalacji rozproszonego można użyć portu -
źródło
możesz użyć
git difftool
.na przykład, jeśli masz połączenie , możesz edytować gałęzie
master
idevel
:źródło
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:
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.
źródło
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ę.
źródło
Używam kompare na Ubuntu:
Aby porównać dwie gałęzie:
źródło
Używam tego bitu
~/.gitconfig
od dłuższego czasu:Z
git-meld
: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:
W tej konfiguracji takie rzeczy działają:
I nadal mogę zachować dobre stare
git diff
.źródło
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 diff
przesłać zwykłe wyjście do pliku „temp”, a następnie po prostu otworzyć ten plik bezpośrednio, bez potrzeby cokolwiek o widzu:Ustawienie go jako globalnego aliasu działa jeszcze lepiej:
git what
źródło
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.
źródło
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,
xd
kiedy chcesz uruchomićgit diff
lubsvn 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.
źródło