Bagaimana cara melihat output 'git diff' dengan alat / penampil diff pilihan saya?

754

Ketika saya mengetik git diff, saya ingin melihat output dengan alat visual diff pilihan saya (SourceGear "diffmerge" pada Windows). Bagaimana cara mengkonfigurasi git untuk melakukan ini?

pengguna3891
sumber
108
Anda dapat menggunakan "git difftool" alih-alih "git diff" di semua versi git yang lebih baru. Itu akan membuka program visual diff.
PlagueHammer
Mengenai difftool skrip baru, saya telah menambahkan jawaban di bawah ini: stackoverflow.com/questions/255202/…
VonC
2
gitx - gitx.frim.nl . Kata Nuff.
Alex Grande
1
Tutorial singkat yang akan Anda temukan di sini: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
Dmitry Bespalov
5
Pergi ke repositori Anda di Git Bash. Jenis git config diff.tool winmerge. Verifikasi itu berfungsi dengan mengetik git difftool. Singkirkan pengetikan prompt git config --global difftool.prompt false. Saya merekomendasikan p4merge, bukan winmerge.
Michael S.

Jawaban:

386

Sejak Git1.6.3, Anda dapat menggunakan skrip git difftool : lihat jawaban saya di bawah ini .


Mungkin artikel ini akan membantu Anda. Inilah bagian-bagian terbaik:

Ada dua cara berbeda untuk menentukan alat diff eksternal.

Yang pertama adalah metode yang Anda gunakan, dengan mengatur variabel GIT_EXTERNAL_DIFF. Namun, variabel tersebut seharusnya menunjuk ke jalur penuh dari executable. Selain itu, executable yang ditentukan oleh GIT_EXTERNAL_DIFF akan dipanggil dengan set tetap 7 argumen:

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

Karena sebagian besar alat diff akan membutuhkan urutan yang berbeda (dan hanya beberapa) dari argumen, Anda kemungkinan besar harus menentukan skrip pembungkus, yang pada gilirannya memanggil alat diff nyata.

Metode kedua, yang saya suka, adalah mengkonfigurasi alat diff eksternal melalui "git config" . Inilah yang saya lakukan:

1) Buat skrip pembungkus "git-diff-wrapper.sh" yang berisi sesuatu seperti

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

Seperti yang Anda lihat, hanya argumen kedua ("file lama") dan kelima ("file baru") yang akan diteruskan ke alat diff.

2) Ketik

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

di prompt perintah, ganti dengan path ke "git-diff-wrapper.sh", jadi ~ / .gitconfig Anda berisi

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

Pastikan untuk menggunakan sintaks yang benar untuk menentukan jalur ke skrip wrapper dan alat diff, yaitu menggunakan maju memangkas bukannya backslash. Dalam kasus saya, saya punya

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

di .gitconfig dan

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

dalam skrip pembungkus. Pikirkan si "kucing" tertinggal!

(Saya kira ' | cat' diperlukan hanya untuk beberapa program yang mungkin tidak mengembalikan status pengembalian yang tepat atau konsisten. Anda mungkin ingin mencoba tanpa cat tambahan jika alat berbeda Anda memiliki status pengembalian eksplisit)

( Diomidis Spinellis menambahkan dalam komentar :

The catperintah diperlukan, karena diff(1), dengan keluar default dengan kode kesalahan jika file berbeda.
Git mengharapkan program diff eksternal untuk keluar dengan kode kesalahan hanya jika kesalahan aktual terjadi, misalnya jika kehabisan memori.
Dengan memipiskan output gitke catkode kesalahan bukan nol, ditutup.
Lebih efisien, program hanya bisa berjalan exitdengan argumen 0.)


Itu (artikel yang dikutip di atas) adalah teori untuk alat eksternal yang didefinisikan melalui file config (bukan melalui variabel lingkungan).
Dalam praktiknya (masih untuk definisi file alat eksternal), Anda dapat merujuk ke:

VONC
sumber
1
ah, saya sudah mengatur program diff eksternal tetapi tidak tahu tentang 7 argumen, terima kasih.
user3891
4
Salam ... ini sangat berguna. Saya mengatur ini dengan "opendiff" (yang meluncurkan utilitas XCode FileMerge yang apik di bawah Mac OS X).
Ryan Delucchi
@Ryan: itu hebat :) Apakah Anda menggunakan pengaturan "diff.external" yang dirinci dalam jawaban ini atau "git difftool" dari jawaban kedua saya di bawah?
VonC
Fantastis! Terima kasih, coba DiffMerge dan opendiff; keduanya bekerja dengan cukup baik.
vfilby
2
Jadi git mengirim 7 argumen ke program diff? Semakin banyak saya belajar tentang Git, semakin saya merasa itu dibuat untuk satu orang: Pemrogram asli. DVD ini sepertinya lebih seperti mainan mengkilap yang tidak banyak membantu.
C Johnson
211

Untuk menyelesaikan jawaban konfigurasi "diff.external" saya sebelumnya di atas:

Seperti yang disebutkan oleh Jakub , Git1.6.3 memperkenalkan git difftool , awalnya diusulkan pada September 2008:

USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(Lihat --extcmddi bagian terakhir dari jawaban ini)

$LOCALberisi konten file dari revisi awal dan $REMOTEberisi konten file di revisi akhir.
$BASEberisi isi file di wor

Ini pada dasarnya git-mergetooldimodifikasi untuk beroperasi pada indeks git / worktree.

Kasus penggunaan yang biasa untuk skrip ini adalah ketika Anda memiliki perubahan bertahap atau tidak bertahap dan Anda ingin melihat perubahan dalam penampil beda berdampingan (mis xxdiff. tkdiff, Dll).

git difftool [<filename>*]

Kasus penggunaan lain adalah ketika Anda ingin melihat informasi yang sama tetapi membandingkan komitmen sewenang-wenang (ini adalah bagian di mana penguraian revarg bisa lebih baik)

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

Kasing penggunaan terakhir adalah ketika Anda ingin membandingkan worktree Anda saat ini dengan sesuatu selain HEAD (mis. Tag)

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

Catatan: sejak Git 2.5, git config diff.tool winmergesudah cukup!
Lihat " git mergetool winmerge "

Dan sejak Git 1.7.11 , Anda memiliki opsi --dir-diff, untuk memunculkan alat-alat diff eksternal yang dapat membandingkan dua hierarki direktori sekaligus setelah mengisi dua direktori sementara, alih-alih menjalankan instance dari alat eksternal satu kali per pasangan file.


Sebelum Git 2.5:

Kasus praktis untuk mengonfigurasikan difftooldengan alat diff khusus Anda:

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

Dengan winmerge.sh disimpan di bagian direktori PATH Anda:

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

Jika Anda memiliki alat lain (kdiff3, P4Diff, ...), buat skrip shell lain, dan difftool.myDiffTool.cmddirektif konfigurasi yang sesuai .
Kemudian Anda dapat dengan mudah beralih alat dengan diff.toolkonfigurasi.

Anda juga memiliki entri blog ini oleh Dave untuk menambahkan rincian lainnya.
(Atau pertanyaan ini untukwinmergeu opsi)

Yang menarik dengan pengaturan ini adalah winmerge.shskrip : Anda dapat menyesuaikannya dengan mempertimbangkan kasus khusus akun.

Lihat misalnya jawaban David Marble di bawah ini untuk contoh yang berkaitan dengan:

  • file baru dalam asal atau tujuan
  • file yang dihapus baik dalam asal atau tujuan

Seperti yang disebutkan Kem Mason dalam jawabannya , Anda juga dapat menghindari pembungkus apa pun dengan menggunakan --extcmdopsi :

--extcmd=<command>

Tentukan perintah khusus untuk melihat perbedaan. git-difftoolmengabaikan default yang dikonfigurasi dan berjalan $command $LOCAL $REMOTEketika opsi ini ditentukan.

Misalnya, ini adalah cara gitkmenjalankan / menggunakan diffalat apa pun .

VONC
sumber
11
Saya harus melarikan diri dari $, untuk $ LOCAL dan $ REMOTE untuk mencegah mereka menjadi "" dan "". Saya akan mengedit untuk mengatakan git config - globla difftool.winmerge.cmd "winmerge.sh \" \ $ LOCAL \ "\" \ $ REMOTE \ ""
Carlos Rendon
Juga, ada ide tentang cara mendapatkan opsi -s (buka beberapa diff dalam satu jendela winmerge) untuk bekerja dalam skema ini?
Carlos Rendon
1
@Carlos: Frank (lihat komentar di atas) ingin Anda melihat stackoverflow.com/questions/1220309/… (untuk membuka beberapa perbedaan dalam satu jendela winmerge)
VonC
1
The --start=dan --end=pilihan tidak diakui dalam v1.7.11
Michael
1
@SteveChambers Ya, saya menyebutkannya di stackoverflow.com/a/10879804/6309 . Saya akan mengedit jawaban ini.
VonC
110

Dalam semangat menjawab pertanyaan yang agak berbeda dari yang diajukan. Coba solusi ini:

$ meld my_project_using_git

Meld memahami git dan menyediakan navigasi di sekitar perubahan terbaru.

Charles Merriam
sumber
17
Itu bagus, jauh lebih mudah untuk diketik meld .daripada git difftooldan harus melihat file yang diubah secara berurutan. Dan itu jauh lebih dekat dengan hg vdiffplugin Mercurial .
Tom
6
Juga, meld .bekerja pada proyek Mercurial dan Subversion juga, kalau-kalau ada yang penasaran.
Tom
Hmm, ketika saya melakukan ini daftar file yang dimodifikasi menunjukkan. Ketika saya mengklik salah satu dari mereka atau melakukan 'bandingkan' itu terbuka sendiri di tab terpisah. Bagaimana cara mendapatkan diff?
misiu_mp
@misiu_mp, saya baru mencobanya, mengklik file yang dimodifikasi, ini menunjukkan diff (file lama dan juga file yang dimodifikasi).
db42
Pada versi apa ini ditambahkan? Tampaknya tidak berfungsi dengan versi berbaur 1.1.5.
Mark Booth
41

Dengan difftool git baru , sesederhana menambahkan ini ke file .gitconfig Anda :

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

Secara opsional, tambahkan juga:

[difftool]
    prompt = false

Lihat juga diffall , sebuah skrip sederhana yang saya tulis untuk memperpanjang perilaku diff standar yang mengganggu (IMO) untuk membuka masing-masing secara serial.

Global .gitconfig pada Windows ada di %USERPROFILE%\.gitconfig

Seba Illingworth
sumber
1
apa $ local dan $ remote apa?
C Johnson
3
+1 untuk metode yang tidak memerlukan skrip pembungkus
jhewlett
@ CJohnson: Path ke file asli dan path ke file yang diedit, masing-masing.
jhewlett
seandainya blog-linknya mati, inilah jawaban SO yang ditautkan: stackoverflow.com/a/1291578/321973
Tobias Kienzler
1
@CJohnson: $ LOCAL selalu komit terbaru. Namun $ REMOTE tidak konsisten. Ketika melihat perubahan di kotak pasir lokal, itu adalah file yang sekarang / diedit, tetapi ketika melakukan komitmen histori berbeda, itu adalah komitmen orang tua . TKI untuk diff normal $ LOCAL = lama dan $ REMOTE = baru. Untuk historis, $ LOCAL = lebih baru dan $ REMOTE = lebih tua.
Granger
40

Sejak git versi 1.6.3 ada " git difftool " yang dapat Anda konfigurasi untuk menggunakan alat diff grafis favorit Anda. Saat ini didukung out-of-the-box adalah kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, difuse dan opendiff ; jika alat yang ingin Anda gunakan tidak ada dalam daftar ini, Anda selalu dapat menggunakan difftool.<tool>.cmdopsi konfigurasi ' '.

"git difftool" menerima opsi yang sama dengan "git diff".

Jakub Narębski
sumber
1
Gabung Araxis juga dikonfigurasi. araxis.com/merge/scm_integration.html
ΩmegaMan
8
contoh penggunaan:git difftool -t kdiff3 HEAD
emanaton
24

Saya punya satu tambahan untuk ini. Saya suka secara teratur menggunakan aplikasi diff yang tidak didukung sebagai salah satu alat default (misalnya kaleidoskop), via

git difftool -t

Saya juga ingin memiliki default diffhanya menjadi baris perintah biasa, jadi pengaturanGIT_EXTERNAL_DIFF variabel bukan pilihan.

Anda bisa menggunakan yang sewenang-wenang diff aplikasi sebagai satu kali dengan perintah ini:

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

Itu hanya melewati 2 file ke perintah yang Anda tentukan, jadi Anda mungkin tidak perlu pembungkus juga.

Kem Mason
sumber
1
Poin bagus: belum ada yang menyebutkan --extcmdopsi itu. +1. Saya telah memasukkannya dalam jawaban saya.
VonC
19

Membangun jawaban VonC untuk menangani penghapusan dan penambahan file, gunakan perintah dan skrip berikut:

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

Yang sama dengan menempatkan ini di global Anda .gitconfig:

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

Kemudian letakkan yang berikut ini di winmerge.shmana Anda harus berada di jalur Anda:

#!/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
sumber
Tambahan yang bagus untuk winmerge.shskrip. +1. Saya telah memperbarui jawaban saya untuk menautkan ke Anda.
VonC
1
winmerge.batdalam cuplikan kedua haruswinmerge.sh
BartoszKP
Bisakah Anda membuat ini untuk banyak alat? Dan mengaitkannya dengan ekstensi file?
Yucer
12

Solusi untuk Windows / msys git

Setelah membaca jawaban, saya menemukan cara yang lebih sederhana yang melibatkan hanya mengubah satu file.

  1. Buat file batch untuk menjalankan program diff Anda, dengan argumen 2 dan 5. File ini harus berada di suatu tempat di jalur Anda. (Jika Anda tidak tahu di mana itu, letakkan di c: \ windows). Sebut saja, misalnya, "gitdiff.bat". Punya saya:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. Setel variabel lingkungan untuk mengarah ke file batch Anda. Sebagai contoh: GIT_EXTERNAL_DIFF=gitdiff.bat. Atau melalui PowerShell dengan mengetik git config --global diff.external gitdiff.bat.

    Penting untuk tidak menggunakan tanda kutip, atau menentukan informasi jalur apa pun, jika tidak maka tidak akan berhasil. Itu sebabnya gitdiff.bat harus ada di jalurmu.

Sekarang ketika Anda mengetik "git diff", itu akan memanggil penampil diff eksternal Anda.

Steve Hanov
sumber
1
+1 (+10 jika saya bisa.) Ini benar-benar solusi paling sederhana. Saya berjuang selama berjam-jam dengan jawaban yang diterima, dan akhirnya menyerah (beberapa masalah saya mungkin terkait dengan menjalankan Git melalui PowerShell ...) Namun, saya menggunakan git config --global diff.external winmerge.cmd, alih-alih mengatur GIT_EXTERNAL_DIFFvariabel lingkungan, dan berfungsi sama baiknya.
Christoffer Lette
Beberapa masalah dengan solusi ini: 1. Tidak berfungsi untuk file baru. WinMerge meminta saya untuk memasukkan file kedua untuk dibandingkan. 2. Jendela untuk membandingkan file berikutnya hanya terbuka setelah Anda menutup jendela WinMerge saat ini, tidak ada cara mudah untuk melihat semua file pada saat yang sama.
Jesus H
9

Jika Anda melakukan ini melalui cygwin, Anda mungkin perlu menggunakan 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`
idbrii
sumber
Untuk beberapa alasan, menggunakan "bc3" tidak lagi berfungsi untuk saya, tetapi jika saya menggunakan "di luar" sebagai gantinya, tidak apa-apa.
idbrii
9

Setelah melihat beberapa alat diff eksternal lainnya, saya menemukan bahwa difftampilan di IntelliJ IDEA (dan Android Studio) adalah yang terbaik untuk saya.

Langkah 1 - setup IntelliJ IDEA untuk dijalankan dari baris perintah

Jika Anda ingin menggunakan IntelliJ IDEA sebagai alat diff Anda, Anda harus mengatur IntelliJ IDEA terlebih dahulu untuk dijalankan dari baris perintah dengan mengikuti instruksi di sini :

Di macOS atau UNIX:

  1. Pastikan IntelliJ IDEA berjalan.
  2. Di menu utama, pilih Tools | Create Command-line Launcher. Kotak dialog Buat Skrip Peluncur terbuka, dengan jalur dan nama skrip peluncur yang disarankan. Anda dapat menerima default, atau menentukan jalur Anda sendiri. Perhatikan itu, karena Anda akan membutuhkannya nanti. Di luar IntelliJ IDEA, tambahkan jalur dan nama skrip peluncur ke jalur Anda.

Di Windows:

  1. Tentukan lokasi IntelliJ IDEA yang dapat dieksekusi dalam variabel lingkungan sistem Path. Dalam hal ini, Anda dapat menjalankan perintah IntelliJ IDEA yang dapat dieksekusi dan perintah IntelliJ IDEA lainnya dari direktori mana pun.

Langkah 2 - konfigurasikan git untuk menggunakan IntelliJ IDEA sebagai difftool

Ikuti instruksi pada posting blog ini :

Pesta

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

Ikan

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

Sekarang tambahkan berikut ini ke konfigurasi git Anda:

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

Anda dapat mencobanya dengan git difftoolataugit difftool HEAD~1

David Rawson
sumber
8

ini berfungsi untuk saya di windows 7. Tidak perlu skrip perantara

isi .gitconfig:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"
Sharas
sumber
Apakah Anda juga mendefinisikan kdiff3 sebagai mergetool Anda? Bolehkah berbagi bagian gitconfig Anda jika demikian?
blong
2
Terima kasih. Ini tidak berhasil bagi saya, tetapi berhasil ketika saya memindahkan pathdan mengganti cmdke"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Steve Chambers
7

Ringkasan singkat dari jawaban-jawaban hebat di atas:

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

Kemudian gunakan dengan mengetik (secara opsional tentukan nama file juga):

git difftool

sumber
6

pengantar

Untuk referensi saya ingin memasukkan variasi saya pada jawaban VonC. Perlu diingat bahwa saya menggunakan versi MSys dari Git (1.6.0.2 saat ini) dengan PATH yang dimodifikasi, dan menjalankan Git sendiri dari Powershell (atau cmd.exe), bukan Bash shell.

Saya memperkenalkan perintah baru gitdiff,. Menjalankan perintah ini sementara dialihkan git diffuntuk menggunakan program visual diff pilihan Anda (bukan solusi VonC yang melakukannya secara permanen). Ini memungkinkan saya untuk memiliki kedua fungsi fungsional Git default ( git diff) dan juga fungsi dif visual ( gitdiff). Kedua perintah mengambil parameter yang sama, jadi misalnya untuk membedakan secara visual perubahan dalam file tertentu yang dapat Anda ketik

gitdiff path/file.txt

Mendirikan

Catatan yang $GitInstalldigunakan sebagai pengganti untuk direktori tempat Git diinstal.

  1. Buat file baru, $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. Buat file baru, $GitInstall\bin\git-diff-visual.cmd(ganti [visual_diff_exe]placeholder dengan path lengkap ke program berbeda pilihan Anda)

    @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. Anda sudah selesai. Menjalankan gitdiffdari dalam repositori Git sekarang harus menjalankan program visual diff Anda untuk setiap file yang diubah.

Milan Gardian
sumber
6

Berikut adalah file batch yang berfungsi untuk Windows - mengasumsikan DiffMerge diinstal di lokasi default, menangani x64, menangani penerusan backslash ke depan sebagaimana diperlukan dan memiliki kemampuan untuk menginstalnya sendiri. Seharusnya mudah untuk mengganti DiffMerge dengan program diff favorit Anda.

Untuk memasang:

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
sumber
Skrip yang bagus, ini menyelamatkan saya dari kesulitan mencari perintah DiffMerge. Anda mungkin ingin mengubah jalur pemasangan untuk menggunakan tanda kutip - Saya mengalami masalah pada mesin saya: "% 1" == "- install".
Mario
6

Jika Anda menggunakan Mac dan memiliki XCode, maka Anda telah menginstal FileMerge. Perintah terminal adalah opendiff, jadi Anda bisa melakukannyagit difftool -t opendiff

LuxuryMode
sumber
2
Gunakan opsi -y untuk menghindari permintaan yang mengganggu. Sayangnya, git akan menunggu hingga FileMerge berhenti sebelum menawarkan file yang diubah berikutnya. Gunakan opsi -d untuk melakukan perbandingan direktori dalam satu kesempatan.
miner49r
Opsi -t tampaknya membutuhkan path lengkap. Mungkin menggunakan git difftool --extcmd = opendiff lebih baik.
Yucer
6

Instal berbaur

 # apt-get install meld

Kemudian pilih itu sebagai difftool

 $ git config --global diff.tool meld

Jika tou ingin menjalankannya pada tipe konsol:

 $ git difftool

Jika Anda ingin menggunakan jenis mode grafis:

 $ git mergetool

Dan hasilnya adalah:

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

Jadi cukup tekan enter untuk menggunakan meld (default), ini akan membuka mode grafik, membuat magic save dan tekan yang menyelesaikan penggabungan. Itu saja

GI Joe
sumber
5

Untuk versi linux cara mengkonfigurasi alat diff pada versi git sebelum 1.6.3 (1.6.3 menambahkan difftool ke git) ini adalah tutorial ringkas yang bagus,

secara singkat:

Langkah 1: tambahkan ini ke .gitconfig Anda

[diff]
  external = git_diff_wrapper
[pager]
  diff =

Langkah 2: buat file bernama git_diff_wrapper, letakkan di suatu tempat di $ PATH Anda

#!/bin/sh

vimdiff "$2" "$5"
Fire Crow
sumber
4

Di Mac OS X,

git difftool -t diffuse 

melakukan pekerjaan untuk saya di folder git. Untuk menginstal difus, orang dapat menggunakan port -

sudo port install diffuse
Shreyas
sumber
3

Anda dapat menggunakan git difftool.

misalnya jika Anda telah berbaur , Anda dapat mengedit cabang masterdan develdengan:

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

Berikut ini dapat diperoleh dari jawaban lain di sini, tetapi bagi saya itu sulit, (terlalu banyak informasi), jadi inilah jawaban 'ketik saja' untuk tkdiff:

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

Anda dapat mengganti nama yang dapat dieksekusi dari alat difing favorit Anda untuk tkdiff. Selama (misalnya tkdiff), (atau alat pembeda favorit Anda) ada di PATH Anda, itu akan diluncurkan.

dolphus333
sumber
ini adalah cara termudah dan tercepat.
Zameer Fouzan
2

Saya mencoba barang-barang mewah di sini (dengan tkdiff) dan tidak ada yang berhasil untuk saya. Jadi saya menulis skrip berikut, tkgitdiff. Itu melakukan apa yang perlu saya lakukan.

$ 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
sumber
1

Saya menggunakan kompare di ubuntu:

sudo apt-get install kompare

Untuk membandingkan dua cabang:

git difftool -t kompare <my_branch> master
Bilal dan Olga
sumber
1

Saya sudah menggunakan bit ini ~/.gitconfigsejak lama:

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

Dengan git-meld:

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

Tapi sekarang saya bosan selalu menggunakan berbaur dalam lingkungan grafis, dan itu tidak sepele untuk memanggil diff normal dengan pengaturan ini, jadi saya beralih ke ini:

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

Dengan pengaturan ini, hal-hal seperti pekerjaan ini:

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

Dan saya masih bisa mempertahankan yang lama yang baik git diff.

abo-abo
sumber
0

Jika Anda sudah memiliki alat diff yang terkait dengan tipe file (katakanlah, karena Anda menginstal TortoiseSVN yang dilengkapi dengan penampil diff), Anda bisa menyalurkan git diffoutput reguler ke file "temp", lalu buka file itu secara langsung tanpa perlu tahu apa pun tentang pemirsa:

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

Menyetelnya sebagai alias global berfungsi lebih baik: git what

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

Jika Anda bukan satu untuk baris perintah maka jika Anda menginstal tortoise git Anda dapat mengklik kanan pada file untuk mendapatkan submenu tortoisegit dengan opsi "Diff later".

Ketika Anda memilih ini pada file pertama Anda kemudian dapat mengklik kanan pada file kedua, pergi ke submenu tortoisegit dan pilih "Diff with == yourfilehere ==" Ini akan memberikan gui tortoisegitmerge untuk hasilnya.

camjocotem
sumber
0

Anda mungkin ingin mencoba xd http://github.com/jiqingtang/xd , yang merupakan pembungkus GUI untuk GIT / SVN diff. Ini BUKAN alat diff itu sendiri. Anda menjalankan xdketika Anda ingin menjalankan git diffatausvn diff dan itu akan menampilkan daftar file, jendela pratinjau dan Anda dapat meluncurkan alat diff yang Anda suka, termasuk tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), meld, difus, kompare dan kdiff3. Anda juga dapat menjalankan alat khusus apa pun.

Sayangnya alat ini tidak mendukung Windows.

Pengungkapan : Saya adalah penulis alat ini.

Jiqing Tang
sumber