Git di Windows: Bagaimana Anda mengatur mergetool?

346

Saya sudah mencoba msysGit dan Git di Cygwin. Keduanya bekerja dengan baik di dalam dan dari diri mereka sendiri dan keduanya menjalankan gitk dan git-gui dengan sempurna.

Sekarang bagaimana cara saya mengkonfigurasi mergetool? (Vimdiff bekerja pada Cygwin, tetapi lebih baik saya menginginkan sesuatu yang sedikit lebih ramah pengguna untuk beberapa rekan kerja kami yang menyukai Windows.)

Jake
sumber
4
Git Extensions memiliki UI git yang memiliki alat penggabungan yang cukup bagus dan ramah pengguna windows.
KallDrexx
Sepertinya Anda membutuhkan TortoiseGit?
Sergei

Jawaban:

304

Untuk menindaklanjuti jawaban Charles Bailey, inilah setup git saya yang menggunakan p4merge (alat penggabungan 3way cross-platform gratis); diuji pada msys Git (Windows) instal:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

atau, dari shell windows cmd.exe, baris kedua menjadi:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

Perubahan (relatif terhadap Charles Bailey):

  • ditambahkan ke global git config, yaitu valid untuk semua proyek git bukan hanya yang sekarang
  • nilai konfigurasi alat kustom berada di "mergetool. [tool] .cmd", bukan "merge. [tool] .cmd" (konyol saya, menghabiskan satu jam pemecahan masalah mengapa git terus mengeluh tentang alat yang tidak ada)
  • menambahkan tanda kutip ganda untuk semua nama file sehingga file dengan spasi masih dapat ditemukan oleh alat gabungan (saya menguji ini di msys Git dari Powershell)
  • perhatikan bahwa secara default Perforce akan menambahkan dir instalasi ke PATH, sehingga tidak perlu menentukan path lengkap ke p4merge dalam perintah

Unduh: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (Feb 2014)

Seperti yang ditunjukkan oleh @Gregory Pakosz , msys git terbaru sekarang "secara native" mendukung p4merge (diuji pada 1.8.5.2.msysgit.0 ).

Anda dapat menampilkan daftar alat yang didukung dengan menjalankan:

git mergetool --tool-help

Anda akan melihat p4merge dalam daftar yang tersedia atau valid . Jika tidak, silakan perbarui git Anda.

Jika p4merge terdaftar sebagai tersedia , itu ada di PATH Anda dan Anda hanya perlu mengatur merge.tool :

git config --global merge.tool p4merge

Jika terdaftar sebagai valid , Anda harus mendefinisikan mergetool.p4merge.path selain merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Di atas adalah contoh lintasan ketika p4merge dipasang untuk pengguna saat ini, tidak untuk seluruh sistem (tidak memerlukan hak admin atau ketinggian UAC)
  • Meskipun ~harus diperluas ke direktori home pengguna saat ini (jadi menurut teori jalan seharusnya ~/AppData/Local/Perforce/p4merge.exe), ini tidak bekerja untuk saya
  • Lebih baik memanfaatkan variabel lingkungan (mis. $LOCALAPPDATA/Perforce/p4merge.exe), Git tampaknya tidak memperluas variabel lingkungan untuk jalur (jika Anda tahu cara membuatnya bekerja, beri tahu saya atau perbarui jawaban ini)
Milan Gardian
sumber
Hmm - coba ini - konfigurasi pertama berfungsi dengan baik, selanjutnya hanya menampilkan teks bantuan untuk konfigurasi git. Tidak yakin kenapa.
Danny Staple
1
Mengerti - kutipan tunggal itu terlihat mencurigakan bagi saya. Cukup gandakan ini dan mereka bekerja.
Danny Staple
13
pengaturan mergetool.p4merge.cmdtidak akan berfungsi lagi karena Git sudah mulai mencoba mendukung p4merge, lihat libexec/git-core/git-mergetool--lib. alih-alih langsung menggunakanmergetool.p4merge.path
Gregory Pakosz
5
Harus meletakkan jalan penuh dan melarikan diri tanda kutip ganda:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty
21
Ini berhasil bagi saya: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'pada mesin Windows 7
Dan P.
88

pengaturan mergetool.p4merge.cmd tidak akan berfungsi lagi karena Git telah mulai mencoba untuk mendukung p4merge, lihat libexec / git-core / git-mergetool--lib.so kita hanya perlu menentukan jalur mergetool untuk git, misalnya p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Maka akan berhasil.

Daizuozhuo
sumber
1
Bekerja dengan Beyond Compare 3 juga. Cukup gunakan jalur ke BComp.exe saja. Terima kasih!
Richard Anthony Hein
4
Saya menyadari ini adalah utas lama, tetapi saya tidak bisa mendapatkan jalan itu untuk bekerja. Saya agak bingung tentang bagaimana jalan seharusnya lolos mengingat interaksi cmd / msys ... EDIT Beralih ke tanda kutip ganda memperbaikinya!
Rustavore
Gitninja terima kasih! Perhatikan bahwa Anda dapat mengetik ini ke Git Bash, tetapi jika Anda menggunakan perintah Prompt, Anda harus mengubah kutipan tunggal ke kutipan ganda
Hải Phong
61

Saya menggunakan Portable Git di WinXP (berhasil!), Dan diperlukan untuk menyelesaikan konflik yang muncul dalam percabangan. Dari semua gui yang saya periksa, KDiff3 terbukti paling transparan untuk digunakan.

Tapi saya menemukan instruksi yang saya butuhkan untuk membuatnya berfungsi di Windows di posting blog ini , instruksi yang sedikit berbeda dari pendekatan lain yang tercantum di sini. Ini pada dasarnya sama dengan menambahkan baris-baris ini ke .gitconfigfile saya :

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Bekerja dengan baik sekarang!

Dɑvïd
sumber
13
pada PC Win7 saya, saya harus menggunakan path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(perhatikan garis miring ganda)
Someone Somewhere
Saya mendapat kesalahan seperti ini "Alat diff berbaur tidak tersedia sebagai 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork
Apakah Anda tahu jika ada perbedaan dengan urutan di mana setiap bagian ditambahkan. Maksud saya, jika [menggabungkan] akan menjadi setelah [mergetool]?
Samuel
20

Di bawah Cygwin, satu - satunya hal yang berhasil untuk saya adalah sebagai berikut:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

Juga, saya ingin mematikan pesan prompt untuk difftool:

git config --global difftool.prompt false
splicer
sumber
16

git mergetool sepenuhnya dapat dikonfigurasi sehingga Anda dapat memilih alat favorit Anda.

Dokumentasi lengkapnya ada di sini: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Secara singkat, Anda dapat mengatur mergetool default dengan mengatur variabel konfigurasi pengguna merge.tool.

Jika alat gabungan adalah salah satu yang didukung secara bawaan, Anda hanya perlu mengatur mergetool.<tool>.pathjalur lengkap ke alat tersebut (ganti <tool>dengan apa yang telah Anda konfigurasi merge.toolmenjadi.

Jika tidak, Anda dapat mengatur mergetool.<tool>.cmdagar sedikit shell dievaluasi saat runtime dengan variabel shell $BASE, $LOCAL, $REMOTE, $MERGEDdiatur ke file yang sesuai. Anda harus sedikit berhati-hati dengan melarikan diri apakah Anda langsung mengedit file konfigurasi atau mengatur variabel dengan git configperintah.

Sesuatu seperti ini harus memberi rasa apa yang dapat Anda lakukan ('mymerge' adalah alat fiksi).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

Setelah Anda menyiapkan alat penggabungan favorit Anda, itu hanya masalah berjalan git mergetoolsetiap kali Anda memiliki konflik untuk diselesaikan.

Alat p4merge dari Perforce adalah alat penggabungan mandiri yang cukup bagus.

CB Bailey
sumber
8

Untuk membandingkan luar biasa pada Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
developer747
sumber
2
Saya menggunakan perintah ini tapi saya menggunakan WinMerge bukan Beyond Compare.
Brent Keller
6

Tampaknya versi git yang lebih baru mendukung p4merge secara langsung, jadi

git config --global merge.tool p4merge

harus menjadi semua yang Anda butuhkan, jika p4merge.exe ada di jalur Anda. Tidak perlu mengatur cmd atau path.

friederbluemle
sumber
Ini kuncinya. Setelah menginstal p4merge dan mengatur mergetool.p4merge.path ke lokasi yang tepat, itu masih tidak berfungsi. Menambahkan folder instalasi ke path berhasil.
RichardM
5

Seperti yang sudah dijawab di sini (dan di sini dan di sini ), mergetool adalah perintah untuk mengkonfigurasi ini. Untuk tampilan grafis yang bagus saya sarankan kdiff3 (GPL).

hlovdal
sumber
4

Saya harus menghapus kutipan tambahan menggunakan msysGit di windows 7, tidak yakin mengapa.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Mike Glenn
sumber
3

Jika Anda melakukan ini melalui cygwin, Anda mungkin perlu menggunakan cygpath:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'
idbrii
sumber
3

Bah, ini akhirnya berhasil untuk saya (Windows 7 + Cygwin + TortoiseMerge):

Dalam .git / config:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

Terima kasih untuk poster sebelumnya untuk tip menggunakan cygpath!

Nathan McDaniel
sumber
3

saya menggunakan aplikasi bernama WinMerge ( http://winmerge.org/ ) info dari manual mereka ( http://manual.winmerge.org/CommandLine.html )

ini adalah skrip bash yang saya gunakan dari mergetooldirektif via.gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

pada dasarnya bash menyumbang ketika hasil diff dalam file kosong dan membuat file temp baru di lokasi yang benar.

xero
sumber
3

Saya menemukan dua cara untuk mengkonfigurasi " SourceGear DiffMerge " sebagai difftool dan mergetool di github Windows.

Perintah berikut di jendela Command Prompt akan memperbarui .gitconfig Anda untuk mengonfigurasi GIT menggunakan DiffMerge:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[ ATAU ]

Tambahkan baris berikut ke .gitconfig Anda. File ini harus di direktori home Anda di C: \ Users \ UserName:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
anggur
sumber
1

Anda mungkin ingin menambahkan opsi ini juga:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

Juga, saya tidak tahu mengapa tetapi kutipan dan tebasan dari jawaban Milan Gardian mengacaukan segalanya bagi saya.

Roberto
sumber
1

Jika ada yang ingin menggunakan gvim sebagai alat diff mereka di TortoiseGit, maka inilah yang perlu Anda masukkan ke input teks untuk path ke alat diff eksternal:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Attila Szeremi
sumber
1

Untuk IntelliJ IDEA (Edisi Komunitas) konfigurasi gget-meritool 3-arah di lingkungan Windows ( ~/.gitconfig)

Cygwin

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

Nyonya

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~ / Winpath.sh adalah untuk mengonversi jalur ke Windows di msys dan diambil dari pertanyaan konversi jalur msys di stackoverflow

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 
Usman Saleem
sumber
0

Jika Anda mengalami masalah dalam membuka p4merge dari SourceTree, cari file konfigurasi lokal bernama config di bawah MyRepo.git dan hapus semua konfigurasi gabungan. Dalam kasus saya itu mencoba membuka Meld yang baru saja saya uninstall

Kautsky Lozano
sumber