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?
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.
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:
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.
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\"
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)
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:
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.
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)
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:
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.
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.
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
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 :
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
@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".
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.
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.
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
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.
+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 :
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:
Pastikan IntelliJ IDEA berjalan.
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:
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
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:
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.
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
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
Anda sudah selesai. Menjalankan gitdiffdari dalam repositori Git sekarang harus menjalankan program visual diff Anda untuk setiap file yang diubah.
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
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
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
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
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.
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
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:
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
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.
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.
git config diff.tool winmerge
. Verifikasi itu berfungsi dengan mengetikgit difftool
. Singkirkan pengetikan promptgit config --global difftool.prompt false
. Saya merekomendasikan p4merge, bukan winmerge.Jawaban:
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:
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
Seperti yang Anda lihat, hanya argumen kedua ("file lama") dan kelima ("file baru") yang akan diteruskan ke alat diff.
2) Ketik
di prompt perintah, ganti dengan path ke "git-diff-wrapper.sh", jadi ~ / .gitconfig Anda berisi
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
di .gitconfig dan
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 :
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:
sumber
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
--extcmd
di bagian terakhir dari jawaban ini)$LOCAL
berisi konten file dari revisi awal dan$REMOTE
berisi konten file di revisi akhir.$BASE
berisi isi file di worKasing penggunaan terakhir adalah ketika Anda ingin membandingkan worktree Anda saat ini dengan sesuatu selain HEAD (mis. Tag)
Catatan: sejak Git 2.5,
git config diff.tool winmerge
sudah 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
difftool
dengan alat diff khusus Anda:Dengan winmerge.sh disimpan di bagian direktori PATH Anda:
Jika Anda memiliki alat lain (kdiff3, P4Diff, ...), buat skrip shell lain, dan
difftool.myDiffTool.cmd
direktif konfigurasi yang sesuai .Kemudian Anda dapat dengan mudah beralih alat dengan
diff.tool
konfigurasi.Anda juga memiliki entri blog ini oleh Dave untuk menambahkan rincian lainnya.
(Atau pertanyaan ini untuk
winmergeu
opsi)Yang menarik dengan pengaturan ini adalah
winmerge.sh
skrip : Anda dapat menyesuaikannya dengan mempertimbangkan kasus khusus akun.Lihat misalnya jawaban David Marble di bawah ini untuk contoh yang berkaitan dengan:
Seperti yang disebutkan Kem Mason dalam jawabannya , Anda juga dapat menghindari pembungkus apa pun dengan menggunakan
--extcmd
opsi :Misalnya, ini adalah cara
gitk
menjalankan / menggunakandiff
alat apa pun .sumber
--start=
dan--end=
pilihan tidak diakui dalam v1.7.11Dalam semangat menjawab pertanyaan yang agak berbeda dari yang diajukan. Coba solusi ini:
Meld memahami git dan menyediakan navigasi di sekitar perubahan terbaru.
sumber
meld .
daripadagit difftool
dan harus melihat file yang diubah secara berurutan. Dan itu jauh lebih dekat denganhg vdiff
plugin Mercurial .meld .
bekerja pada proyek Mercurial dan Subversion juga, kalau-kalau ada yang penasaran.1.1.5
.Dengan difftool git baru , sesederhana menambahkan ini ke file .gitconfig Anda :
Secara opsional, tambahkan juga:
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
sumber
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>.cmd
opsi konfigurasi ' '."git difftool" menerima opsi yang sama dengan "git diff".
sumber
git difftool -t kdiff3 HEAD
Saya punya satu tambahan untuk ini. Saya suka secara teratur menggunakan aplikasi diff yang tidak didukung sebagai salah satu alat default (misalnya kaleidoskop), via
Saya juga ingin memiliki default
diff
hanya 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:Itu hanya melewati 2 file ke perintah yang Anda tentukan, jadi Anda mungkin tidak perlu pembungkus juga.
sumber
--extcmd
opsi itu. +1. Saya telah memasukkannya dalam jawaban saya.Membangun jawaban VonC untuk menangani penghapusan dan penambahan file, gunakan perintah dan skrip berikut:
Yang sama dengan menempatkan ini di global Anda
.gitconfig
:Kemudian letakkan yang berikut ini di
winmerge.sh
mana Anda harus berada di jalur Anda:sumber
winmerge.sh
skrip. +1. Saya telah memperbarui jawaban saya untuk menautkan ke Anda.winmerge.bat
dalam cuplikan kedua haruswinmerge.sh
Solusi untuk Windows / msys git
Setelah membaca jawaban, saya menemukan cara yang lebih sederhana yang melibatkan hanya mengubah satu file.
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:
Setel variabel lingkungan untuk mengarah ke file batch Anda. Sebagai contoh:
GIT_EXTERNAL_DIFF=gitdiff.bat
. Atau melalui PowerShell dengan mengetikgit 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.
sumber
git config --global diff.external winmerge.cmd
, alih-alih mengaturGIT_EXTERNAL_DIFF
variabel lingkungan, dan berfungsi sama baiknya.Jika Anda melakukan ini melalui cygwin, Anda mungkin perlu menggunakan cygpath :
sumber
Setelah melihat beberapa alat diff eksternal lainnya, saya menemukan bahwa
diff
tampilan 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:
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:
Langkah 2 - konfigurasikan git untuk menggunakan IntelliJ IDEA sebagai difftool
Ikuti instruksi pada posting blog ini :
Pesta
Ikan
Sekarang tambahkan berikut ini ke konfigurasi git Anda:
Anda dapat mencobanya dengan
git difftool
ataugit difftool HEAD~1
sumber
ini berfungsi untuk saya di windows 7. Tidak perlu skrip perantara
isi .gitconfig:
sumber
path
dan mengganticmd
ke"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
Ringkasan singkat dari jawaban-jawaban hebat di atas:
Kemudian gunakan dengan mengetik (secara opsional tentukan nama file juga):
sumber
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 dialihkangit diff
untuk 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 ketikMendirikan
Catatan yang
$GitInstall
digunakan sebagai pengganti untuk direktori tempat Git diinstal.Buat file baru,
$GitInstall\cmd\gitdiff.cmd
Buat file baru,
$GitInstall\bin\git-diff-visual.cmd
(ganti[visual_diff_exe]
placeholder dengan path lengkap ke program berbeda pilihan Anda)Anda sudah selesai. Menjalankan
gitdiff
dari dalam repositori Git sekarang harus menjalankan program visual diff Anda untuk setiap file yang diubah.sumber
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.bat:
sumber
Jika Anda menggunakan Mac dan memiliki XCode, maka Anda telah menginstal FileMerge. Perintah terminal adalah opendiff, jadi Anda bisa melakukannya
git difftool -t opendiff
sumber
Instal berbaur
Kemudian pilih itu sebagai difftool
Jika tou ingin menjalankannya pada tipe konsol:
Jika Anda ingin menggunakan jenis mode grafis:
Dan hasilnya adalah:
Jadi cukup tekan enter untuk menggunakan meld (default), ini akan membuka mode grafik, membuat magic save dan tekan yang menyelesaikan penggabungan. Itu saja
sumber
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
Langkah 2: buat file bernama git_diff_wrapper, letakkan di suatu tempat di $ PATH Anda
sumber
Di Mac OS X,
melakukan pekerjaan untuk saya di folder git. Untuk menginstal difus, orang dapat menggunakan port -
sumber
Anda dapat menggunakan
git difftool
.misalnya jika Anda telah berbaur , Anda dapat mengedit cabang
master
dandevel
dengan:sumber
Berikut ini dapat diperoleh dari jawaban lain di sini, tetapi bagi saya itu sulit, (terlalu banyak informasi), jadi inilah jawaban 'ketik saja' untuk tkdiff:
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.
sumber
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.
sumber
Saya menggunakan kompare di ubuntu:
Untuk membandingkan dua cabang:
sumber
Saya sudah menggunakan bit ini
~/.gitconfig
sejak lama:Dengan
git-meld
: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:
Dengan pengaturan ini, hal-hal seperti pekerjaan ini:
Dan saya masih bisa mempertahankan yang lama yang baik
git diff
.sumber
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 diff
output reguler ke file "temp", lalu buka file itu secara langsung tanpa perlu tahu apa pun tentang pemirsa:Menyetelnya sebagai alias global berfungsi lebih baik:
git what
sumber
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.
sumber
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
xd
ketika Anda ingin menjalankangit diff
atausvn 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.
sumber