Tercih edilen fark aracım / görüntüleyicimle 'git diff' çıktısını nasıl görüntülerim?


754

Ben yazarken git diff, ben (Windows üzerinde SourceGear "diffmerge") seçim benim görsel diff aracıyla çıktı görüntülemek istiyorum. Git'i bunu yapmak için nasıl yapılandırabilirim?


108
Git'in tüm yeni sürümlerinde "git diff" yerine "git difftool" kullanabilirsiniz. Görsel bir fark programı açılacaktır.
PlagueHammer

Yeni script difftool ile ilgili olarak, bir cevap ekledim: stackoverflow.com/questions/255202/…
VonC

2
gitx - gitx.frim.nl . Dedi Nuff.
Alex Grande


5
Git Bash'teki deponuza gidin. Tür git config diff.tool winmerge. Yazarak çalıştığını doğrulayın git difftool. Hızlı yazmadan kurtulun git config --global difftool.prompt false. Winmerge yerine p4merge öneririm.
Michael S.

Yanıtlar:


386

Git1.6.3'ten beri git difftool betiğini kullanabilirsiniz : aşağıdaki cevabımı görün .


Belki bu makale size yardımcı olacaktır. İşte en iyi parçalar:

Harici bir fark aracı belirtmenin iki farklı yolu vardır.

Birincisi, GIT_EXTERNAL_DIFF değişkenini ayarlayarak kullandığınız yöntemdir. Ancak, değişkenin çalıştırılabilir dosyanın tam yolunu göstermesi beklenir. Ayrıca, GIT_EXTERNAL_DIFF tarafından belirtilen yürütülebilir dosya, 7 argümanlık sabit bir setle çağrılır:

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

Çoğu fark aracı farklı bir sıra (ve yalnızca bir kısmı) gerektirdiğinden, büyük olasılıkla bunun yerine bir sarmalayıcı komut dosyası belirtmeniz gerekir;

Tercih ettiğim ikinci yöntem, harici fark aracını "git config" aracılığıyla yapılandırmaktır . İşte yaptığım şey:

1) "git-diff-wrapper.sh" gibi bir şey içeren bir sarmalayıcı komut dosyası oluşturun

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

Gördüğünüz gibi diff aracına yalnızca ikinci ("eski dosya") ve beşinci ("yeni dosya") argümanları aktarılacaktır.

2) Türü

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

komut isteminde "git-diff-wrapper.sh" yolunun yerine geçerek ~ / .gitconfig dosyanız

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

Sarıcı komut dosyası ve diff aracının yollarını belirtmek için doğru sözdizimini kullandığınızdan emin olun, yani ters eğik çizgiler yerine eğik çizgi kullanın. Benim durumumda var

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

.gitconfig ve

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

sarıcı komut dosyasında. Sondaki "kedi" dikkat!

(' | cat' Yalnızca uygun veya tutarlı bir dönüş durumu döndürmeyen bazı programlar için gereklidir. Fark aracınızda açık dönüş durumu varsa, takip eden kedi olmadan denemek isteyebilirsiniz)

( Diomidis Spinellis yorumlara şunları ekliyor :

catKomut, çünkü gereklidir diff(1)dosyalar farklı ise, bir hata kodu ile varsayılan çıkışların tarafından.
Git, harici diff programının yalnızca gerçek bir hata oluştuğunda, örneğin bellek yetersizse bir hata koduyla çıkmasını bekler.
Çıktısının tarafından gitiçin catsıfır olmayan bir hata kodu maskelenir.
Daha verimli bir şekilde, program exit0 ile çalışabilir ve 0 argümanı olabilir.)


Bu (yukarıda alıntılanan makale) yapılandırma dosyası (ortam değişkeni yoluyla değil) ile tanımlanan harici araç teorisidir .
Pratikte (hala harici aracın yapılandırma dosyası tanımı için) başvurabilirsiniz:


1
ah, harici fark programını ayarlardım ama 7 argüman hakkında bir şey bilmiyordum, teşekkürler.
user3891

4
Şeref ... bu çok kullanışlı. Ben "opendiff" (Mac OS X altında kaygan XCode FileMerge yardımcı programını başlatır) ile ayarladım.
Ryan Delucchi

@Ryan: bu harika :) Bu cevapta ayrıntılı olarak verilen "diff.external" ayarını mı, yoksa aşağıdaki ikinci cevabımın "git difftool" u kullandınız mı?
VonC

Fantastik! Teşekkür ederim, hem DiffMerge hem de opendiff'i denedim; her ikisi de oldukça iyi çalışıyor.
vfilby

2
Yani git diff programına 7 argüman gönderir mi? Git hakkında ne kadar çok şey öğrenirsem, o kadar çok kişi için yapıldığını hissediyorum: Orijinal programcı. Bu DVD'ler daha fazla bir şey yapmayan parlak bir oyuncak gibi görünüyor.
C Johnson

211

Yukarıdaki önceki "diff.external" yapılandırma yanıtımı tamamlamak için :

Jakub tarafından belirtildiği gibi , Git 1.6.6 , başlangıçta Eylül 2008'de önerilen git difftool'u tanıttı :

KULLANIM = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
( --extcmdBu cevabın son bölümüne bakınız )

$LOCALbaşlangıç ​​revizyonundan $REMOTEdosyanın içeriğini ve bitiş revizyonundaki dosyanın içeriğini içerir.
$BASEdosya içeriğini içerir

Temelde git-mergetoolgit indeksi / çalışma ağacında çalışacak şekilde değiştirilmiştir.

Ya sahnelenen veya unstaged değişiklikler ve bir yan-yana fark izleyicide değişiklikleri (örneğin görmek istiyorum ne zaman bu komut dosyası için olağan bir kullanım durumu xxdiff, tkdiffvs.).

git difftool [<filename>*]

Başka bir kullanım örneği, aynı bilgileri görmek istediğinizde ancak keyfi taahhütleri karşılaştırdığınızda (bu, revarg ayrışmasının daha iyi olabileceği kısımdır)

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

Son kullanım durumu, mevcut çalışma ağacınızı HEAD dışında bir şeyle (örneğin bir etiket) karşılaştırmak istediğiniz zamandır.

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

Not: Git 2.5'ten beri git config diff.tool winmergeyeterlidir!
Bkz. " Git mergetool winmerge "

Ve Git 1.7.11 beri , sen seçeneği var --dir-diffiki geçici dizinleri doldurma yerine bir dosya çifti başına bir kere dış aracının bir örneğini çalıştırdıktan sonra bir anda iki dizin hiyerarşileri karşılaştırabilirsiniz dış fark araçları yumurtlamaya amacıyla,.


Git 2.5'ten önce:

difftoolÖzel fark aracınızla yapılandırma için pratik durum :

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

PATH'inizin bir dizin bölümünde depolanan winmerge.sh ile:

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

Başka bir aracınız (kdiff3, P4Diff, ...) varsa, başka bir kabuk betiği ve uygun difftool.myDiffTool.cmdyapılandırma yönergesi oluşturun.
Daha sonra diff.toolyapılandırma ile araçları kolayca değiştirebilirsiniz .

Ayrıca Dave tarafından başka ayrıntılar eklemek için bu blog girişine sahipsiniz .
(Veya seçenekler için bu soruwinmergeu )

Bu ayara olan ilgi winmerge.shbetiğidir : özel durumları dikkate almak için özelleştirebilirsiniz.

Örneğin bakınız David Mermer 'in altında cevap hangi fırsatlar ile örneğin:

  • kaynak veya hedefte yeni dosyalar
  • menşe veya hedefte kaldırılan dosyalar

Kem Mason'ın cevabında bahsettiği gibi , --extcmdseçeneği kullanarak herhangi bir sarıcıdan da kaçınabilirsiniz :

--extcmd=<command>

Farkları görüntülemek için özel bir komut belirtin. git-difftoolyapılandırılan varsayılanları yok sayar ve $command $LOCAL $REMOTEbu seçenek belirtildiğinde çalışır .

Örneğin, gitkherhangi bir diffaracı bu şekilde çalıştırabilir / kullanabilirsiniz .


11
Ben "" ve "" olmalarını önlemek için $ LOCAL ve $ REMOTE için $ kaçmak zorunda kaldı. Git config --globla difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" \ $ REMOTE \ ""
Carlos Rendon

Ayrıca, -s seçeneği (bir winmerge penceresinde birkaç diffs açmak) bu şemada çalışmak için nasıl bir fikir?
Carlos Rendon

1
@Carlos: Frank (yukarıdaki açıklamaya bakınız) stackoverflow.com/questions/1220309/… (bir winmerge penceresinde birkaç diffs açmak için ) 'e bakmanızı istedi
VonC

1
--start=Ve --end=seçenekler v1.7.11 içinde tanınmaz
Michael

1
@SteveChambers Evet, stackoverflow.com/a/10879804/6309 içinde bahsetmiştim . Bu cevabı düzenleyeceğim.
VonC

110

Sorulmaktan biraz farklı soruları cevaplama ruhu içinde. Bu çözümü deneyin:

$ meld my_project_using_git

Meld git'i anlar ve son değişikliklerde gezinmeyi sağlar.


17
Yani yazmak için çok daha kolay, harika meld .daha git difftoolve sırayla değiştirilen dosyaları görüntülemek gerekiyor. Ve Mercurial'ın hg vdiffeklentisine çok daha yakın .
Tom

6
Ayrıca meld .meraklı olması durumunda Mercurial ve Subversion projelerinde de çalışır.
Tom

Hmm, bunu yaptığımda değiştirilmiş dosyaların bir listesini gösterir. Bunlardan birine tıkladığımda veya 'karşılaştır' yaptığımda ayrı bir sekmede tek başına açılır. Farkımı nasıl alırım?
misiu_mp

@misiu_mp, ben sadece denedim, değiştirilmiş dosyaları tıklayarak, diff (eski dosya ve değiştirilmiş dosya) gösterir.
db42

Bu hangi sürüme eklendi? Meld sürümü ile çalışmıyor gibi görünüyor 1.1.5.
Mark Booth

41

Yeni git difftool ile bunu .gitconfig dosyanıza eklemek kadar basit :

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

İsteğe bağlı olarak şunları da ekleyin:

[difftool]
    prompt = false

Ayrıca diffall , seri her açılış rahatsız edici (IMO) varsayılan fark davranışını genişletmek için yazdım basit bir komut dosyası göz atın .

Windows'ta genel .gitconfig sürümü %USERPROFILE%\.gitconfig


1
$ local nedir ve $ remote nedir?
C Johnson


@CJohnson: Sırasıyla orijinal dosyanın yolu ve düzenlenen dosya yolu.
jhewlett

blog bağlantısının ölmesi durumunda, bağlantılı SO yanıtı
aşağıdadır

1
@CJohnson: $ LOCAL her zaman en son taahhüttür. Ancak $ REMOTE tutarlı değil. Yerel sanal alandaki değişikliklere bakıldığında, geçerli / düzenlenmiş dosyadır, ancak tarihsel taahhütleri farklılaştırırken, ana taahhüttür. Normal farklar için IOW $ LOCAL = eski ve $ REMOTE = yeni. Geçmişte, $ LOCAL = daha yeni ve $ REMOTE = daha eski.
Granger

40

Git sürüm 1.6.3 beri favori grafik fark aracını kullanmak için yapılandırabilirsiniz " git difftool " vardır. Şu anda kutuda desteklenen kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse ve opendiff ; kullanmak istediğiniz araç bu listede yoksa, her zaman ' difftool.<tool>.cmd' yapılandırma seçeneğini kullanabilirsiniz.

"git difftool", "git diff" ile aynı seçenekleri kabul eder.


1
Araxis Merge de yapılandırıldı. araxis.com/merge/scm_integration.html
ΩmegaMan

8
örnek kullanım:git difftool -t kdiff3 HEAD
emanaton

24

Buna bir tane daha ekledim. Düzenli olarak varsayılan araçlardan biri (örneğin kaleydoskop) olarak desteklenmeyen bir diff uygulamasını kullanmayı seviyorum.

git difftool -t

Ben de varsayılan diffsadece normal komut satırı olmasını istiyorum, bu yüzden GIT_EXTERNAL_DIFFdeğişkeni ayarlamak bir seçenek değildir.

diffBu komutla rastgele bir uygulamayı bir kerelik olarak kullanabilirsiniz :

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

Sadece 2 dosyayı belirttiğiniz komuta iletir, bu yüzden muhtemelen bir sarıcıya da ihtiyacınız yoktur.


1
İyi bir nokta: kimse henüz bu --extcmdseçenekten bahsetmedi . +1. Cevabıma ekledim.
VonC

19

VonC'nin dosya kaldırma ve eklemelerle ilgilenme cevabını temel alarak aşağıdaki komutları ve komut dosyalarını kullanın:

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

Bu, bunu globalinize koymakla aynı şeydir .gitconfig:

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

Ardından, winmerge.shyolunuzda olması gereken aşağıdakileri koyun :

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

winmerge.shSenaryoya mükemmel bir ek . +1. Sizinkiyle bağlantı kurmak için cevabımı güncelledim .
VonC

1
winmerge.batikinci pasaj olmalıdırwinmerge.sh
BartoszKP

Bunu birçok araç için yapabilir misiniz? Ve onları dosya uzantısı ile ilişkilendirmek?
yucer

12

Windows / msys git için çözüm

Yanıtları okuduktan sonra, yalnızca bir dosyayı değiştirmeyi içeren daha basit bir yol keşfettim.

  1. Diff programınızı çağırmak için, argüman 2 ve 5 ile bir toplu iş dosyası oluşturun. Bu dosya, yolunuzda bir yerde olmalıdır. (Bunun nerede olduğunu bilmiyorsanız, c: \ windows içine koyun). Örneğin, "gitdiff.bat" deyin. Benimki:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. Ortam değişkenini toplu iş dosyanızı gösterecek şekilde ayarlayın. Örneğin: GIT_EXTERNAL_DIFF=gitdiff.bat. Veya powershell yazarak git config --global diff.external gitdiff.bat.

    Tırnak kullanmamanız veya herhangi bir yol bilgisi belirtmemeniz önemlidir, aksi takdirde çalışmaz. Bu yüzden gitdiff.bat yolunda olmalı.

Şimdi "git diff" yazdığınızda, harici fark görüntüleyicinizi çağırır.


1
+1 (eğer yapabilirsem +10.) Bu gerçekten en basit çözüm. Kabul edilen cevapla saatlerce mücadele ettim ve sonunda vazgeçtim (bazı problemlerim Git'in PowerShell üzerinden çalıştırılmasıyla bağlantılıydı ...) Ancak, ortam değişkenini git config --global diff.external winmerge.cmdayarlamak yerine kullandım GIT_EXTERNAL_DIFFve eşit derecede iyi çalışıyor.
Christoffer Lette

Bu çözümle ilgili birkaç sorun: 1. Yeni dosyalar için çalışmaz. WinMerge, karşılaştırmak için ikinci bir dosya girmemi istiyor. 2. Bir sonraki dosyayı karşılaştırmak için pencere sadece geçerli WinMerge penceresini kapattıktan sonra açılır, tüm dosyaları aynı anda görmenin kolay bir yolu yoktur.
Jesus H

9

Bunu cygwin üzerinden yapıyorsanız, cygpath kullanmanız gerekebilir :

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

Bazı nedenlerden ötürü, "bc3" kullanmak artık benim için çalışmıyor ancak onun yerine "ötesi" kullanırsam sorun olmaz.
idbrii

9

Diğer harici fark araçlarına baktıktan sonra diff, IntelliJ IDEA'daki (ve Android Studio) görünümün benim için en iyisi olduğunu gördüm .

Adım 1 - IntelliJ IDEA'yı komut satırından çalıştırılacak şekilde ayarlayın

Eğer fark aracı olarak IntelliJ IDEA kullanmak istiyorsanız, öncelikle kurulum IntelliJ IDEA talimatlarını izleyerek komut satırından çalıştırılacak gerektiğini burada :

MacOS veya UNIX'te:

  1. IntelliJ IDEA'nın çalıştığından emin olun.
  2. Ana menüde öğesini seçin Tools | Create Command-line Launcher. Başlatıcı komut dosyası için önerilen yol ve adla birlikte Başlatıcı Komut Dosyası Oluştur iletişim kutusu açılır. Varsayılanı kabul edebilir veya kendi yolunuzu belirleyebilirsiniz. Daha sonra ihtiyaç duyacağınız için dikkat edin. IntelliJ IDEA dışında, başlatıcı komut dosyasının yolunu ve adını yolunuza ekleyin.

Windows'ta:

  1. Yol sistemi ortam değişkeninde IntelliJ IDEA yürütülebilir dosyasının konumunu belirtin. Bu durumda, herhangi bir dizinden IntelliJ IDEA yürütülebilir dosyasını ve diğer IntelliJ IDEA komutlarını çağırabilirsiniz.

Adım 2 - Git'i IntelliJ IDEA'yı difftool olarak kullanacak şekilde yapılandırın

Bu blog gönderisindeki talimatları izleyerek :

darbe

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

Balık

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

Şimdi git config'inize aşağıdakileri ekleyin:

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

Sen bunu deneyebilirsiniz git difftoolyagit difftool HEAD~1


8

Windows 7'de benim için çalışıyor. Ara sh komut dosyalarına gerek yok

içeriği .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

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

Ayrıca birleştirme aracınız olarak tanımlanmış kdiff3 var mı? Eğer öyleyse gitconfig'inizin bu bölümünü paylaşmak ister misiniz?
blong

2
Teşekkürler. Ben kaldırıldı, bu oldukça benim için işe yaramadı ama çalışma yaptı pathve değişmiş cmdiçin"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Steve Chambers

7

Yukarıdaki harika cevapların kısa bir özeti:

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

Sonra yazarak kullanın (isteğe bağlı olarak dosya adını da belirtin):

git difftool

6

Giriş

Referans olarak, varyasyonumu VonC'nin cevabına dahil etmek istiyorum. Git'in MSys sürümünü (şu anda 1.6.0.2) değiştirilmiş PATH ile kullandığımı ve Git'i Bash kabuğundan değil, Powershell'den (veya cmd.exe) çalıştırdığımı unutmayın.

Yeni bir komut getirdim gitdiff. Bu komutu çalıştırmak geçici git diffolarak seçtiğiniz görsel fark programını kullanmak üzere yönlendirir (VonC'nin kalıcı olarak yaptığı çözümün aksine). Bu, hem varsayılan Git fark işlevselliğine ( git diff) hem de görsel fark işlevselliğine ( gitdiff) sahip olmamı sağlar . Her iki komut da aynı parametreleri alır, bu nedenle örneğin belirli bir dosyadaki değişiklikleri görsel olarak farklılaştırmak için

gitdiff path/file.txt

Kurmak

$GitInstallGit'in yüklü olduğu dizin için yer tutucu olarak kullanıldığını unutmayın .

  1. Yeni bir dosya oluşturun, $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. Yeni bir dosya oluşturun $GitInstall\bin\git-diff-visual.cmd( [visual_diff_exe]yer tutucuyu istediğiniz fark programının tam yoluyla değiştirmek )

    @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. Artık bitti. Koşu gitdiffbir Git depo içinden şimdi değiştirildi her dosya için görsel fark programını çağırmak gerekir.


6

İşte Windows için çalışan bir toplu iş dosyası - DiffMerge'nin varsayılan konuma yüklendiğini, x64'ü işlediğini, gerekirse ters eğik çizgi değiştirmeyi ileriye taşıdığını ve kendini yükleme yeteneğine sahip olduğunu varsayar. DiffMerge'ı favori diff programınızla değiştirmek kolay olmalıdır.

Yüklemek:

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

Harika bir senaryo, bana DiffMerge komutlarına bakma zahmetinden kurtardı. Yükleme satırını tırnak işareti kullanarak değiştirmek isteyebilirsiniz - Makinemde sorun yaşadım: "% 1" == "- install".
Mario

6

Mac kullanıyorsanız ve XCode'unuz varsa, FileMerge yüklüdür. Terminal komutu opendiff, bu yüzden sadecegit difftool -t opendiff


2
Can sıkıcı istemlerden kaçınmak için -y seçeneğini kullanın. Ne yazık ki git, bir sonraki değiştirilen dosyayı sunmadan önce FileMerge'den çıkmayı bekleyecektir. Bir çekimde bir dizin karşılaştırması yapmak için -d seçeneğini kullanın.
miner49r

-T seçeneği tam yolu gerektiriyor gibi görünüyor. Belki git difftool --extcmd = opendiff kullanmak daha iyidir.
yucer

6

Meld yükleyin

 # apt-get install meld

Sonra difftool olarak seçin

 $ git config --global diff.tool meld

Konsol türünde çalıştırmak istiyorsanız:

 $ git difftool

Grafik modu türünü kullanmak istiyorsanız:

 $ git mergetool

Ve çıktı:

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

Yani sadece meld kullanmak için enter tuşuna basın (varsayılan), bu grafik modunu açar, sihri kurtarır ve birleştirmeyi çözen düğmeye basar. Bu kadar


5

1.6.3 sürümünden önce git sürümlerinde diff aracı nasıl yapılandırılacağının linux sürümü için (1.6.3 git'e difftool eklendi) bu harika bir kısa eğitimdir ,

kısaca:

1.Adım: Bunu .gitconfig dosyanıza ekleyin

[diff]
  external = git_diff_wrapper
[pager]
  diff =

2.Adım: Git_diff_wrapper adlı bir dosya oluşturun, $ PATH'nıza bir yere koyun

#!/bin/sh

vimdiff "$2" "$5"

4

Mac OS X'te,

git difftool -t diffuse 

git klasöründe benim için işi yapar. Dağınık kurulum için, bağlantı noktası kullanılabilir -

sudo port install diffuse

3

kullanabilirsiniz git difftool.

Eğer varsa, örneğin karışmak , sen branşlarda düzenleyebilir masterve develölçütü:

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

3

Buradaki diğer cevaplardan aşağıdakiler çıkarılabilir, ancak benim için zor, (çok fazla bilgi), bu yüzden tkdiff için 'sadece yazın' cevabı:

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

Favori farklı aracınızın yürütülebilir adını tkdiff olarak değiştirebilirsiniz. PATH'nizde (örn. Tkdiff), (veya en sevdiğiniz farklı aracınız) olduğu sürece, başlatılır.


bu en basit ve en hızlı yoldur.
Zameer Fouzan

2

Burada (tkdiff ile) süslü şeyler denedim ve hiçbir şey benim için çalıştı. Bu yüzden şu senaryoyu yazdım, tkgitdiff. Yapmam gerekeni yapıyor.

$ 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

Ubuntu üzerinde kompare kullanıyorum:

sudo apt-get install kompare

İki dalı karşılaştırmak için:

git difftool -t kompare <my_branch> master

1

Bu biti ~/.gitconfiguzun süredir kullanıyorum:

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

İle git-meld:

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

Ama şimdi her zaman grafik ortamında meld kullanmaktan bıktım ve bu kurulumla normal farkı çağırmak önemsiz değil, bu yüzden buna geçtim:

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

Bu kurulumla, bunun gibi şeyler işe yarar:

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

Ve hala iyi olanı koruyacağım git diff.


0

Eğer zaten dosya türleriyle ilişkilendirilmiş bir fark aracınız varsa (örneğin, farklı bir görüntüleyici ile gelen TortoiseSVN'yi yüklediğiniz için) normal git diffçıktıyı bir "temp" dosyasına bağlayabilirsiniz, daha sonra bilmeniz gerekmeden bu dosyayı doğrudan açabilirsiniz izleyici hakkında herhangi bir şey:

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

Genel bir takma ad olarak ayarlamak daha da iyi çalışır: git what

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

0

Komut satırı için bir kişi değilseniz, kaplumbağa git'i yüklerseniz, bir dosyayı sağ tıklatarak "Daha sonra farklılaştır" seçeneğiyle bir kaplumbağa alt menüsü alabilirsiniz.

Bunu ilk dosyada seçtiğinizde, ikinci dosyayı sağ tıklatıp tortoisegit alt menüsüne gidebilir ve "Diff with == yourfilehere ==" seçeneğini belirleyebilirsiniz. Bu, sonuç için tortoisegitmerge gui'sini verecektir.


0

GIT / SVN fark için GUI sarıcı olan xd http://github.com/jiqingtang/xd'yi denemek isteyebilirsiniz . Farklı bir aracın kendisi DEĞİLDİR. Çalıştırmak xdistediğinizde çalışıyorsunuz git diffveya svn diffsize bir dosya listesi, bir önizleme penceresi gösterecek ve tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), meld, dağınık, kompare ve kdiff3. Ayrıca herhangi bir özel aracı da çalıştırabilirsiniz.

Maalesef araç Windows'u desteklemiyor.

Açıklama : Bu aracın yazarıyım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.