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?


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:


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 .


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.


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


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".


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.


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

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.


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`

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


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"

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

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.


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

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


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


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"

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

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

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.


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

1

Saya menggunakan kompare di ubuntu:

sudo apt-get install kompare

Untuk membandingkan dua cabang:

git difftool -t kompare <my_branch> master

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.


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"

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.