Menyiapkan dan menggunakan Meld sebagai git difftool dan mergetool Anda

255

Meskipun banyak informasi dalam pertanyaan dan jawaban ini tersedia di StackOverflow , itu tersebar di banyak halaman dan di antara jawaban lain yang salah atau menyesatkan. Butuh beberapa saat untuk mengumpulkan semua yang ingin saya ketahui.

Ada banyak program berbeda yang dapat digunakan sebagai git difftool dan mergetool Anda, dan tentu saja tidak ada konsensus tentang mana yang terbaik (pendapat, persyaratan, dan OS jelas akan berbeda).

Meld adalah pilihan gratis, sumber terbuka, dan lintas platform (UNIX / Linux, OSX, Windows) yang populer, seperti ditunjukkan dalam pertanyaan StackOverflow , Apa alat penggabungan visual terbaik untuk Git? , di mana jawaban yang mengusulkan Meld memiliki lebih dari 3 kali suara dibandingkan alat lainnya.

2 pertanyaan berikut akan dijawab dalam jawaban saya di bawah:

  • Bagaimana cara saya mengatur dan menggunakan Meld sebagai git difftool saya?
  • Bagaimana cara saya mengatur dan menggunakan Meld sebagai git mergetool saya?

Catatan: Tidak perlu menggunakan program yang sama seperti difftool dan mergetool Anda, program yang berbeda dapat diatur untuk keduanya.

Mattst
sumber
1
Posting terkait - Cara mengkonfigurasi alat diff di Git secara umum .
RBT

Jawaban:

423

Bagaimana cara saya mengatur dan menggunakan Meld sebagai git difftool saya?

git difftool menampilkan diff menggunakan program diff GUI (mis. Meld) alih-alih menampilkan output diff di terminal Anda.

Meskipun Anda dapat mengatur program GUI pada baris perintah dengan menggunakannya -t <tool> / --tool=<tool>lebih masuk akal untuk mengkonfigurasinya dalam .gitconfigfile Anda . [Catatan: Lihat bagian tentang menghindari kutip dan jalur Windows di bagian bawah.]

# Add the following to your .gitconfig file.
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"

[Catatan: Pengaturan ini tidak akan mengubah perilaku git diffyang akan terus berfungsi seperti biasa.]

Anda menggunakan git difftooldengan cara yang persis sama seperti yang Anda gunakan git diff. misalnya

git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name

Jika dikonfigurasi dengan benar jendela Meld akan terbuka menampilkan diff menggunakan antarmuka GUI.

Urutan panel jendela MUI GUI dapat dikontrol dengan urutan $LOCALdan $REMOTEmasuk cmd, artinya file mana yang ditampilkan di panel kiri dan yang di panel kanan. Jika Anda menginginkannya sebaliknya, tukar saja seperti ini:

    cmd = meld "$REMOTE" "$LOCAL"

Akhirnya prompt = falsesaluran hanya menghentikan git dari meminta Anda, apakah Anda ingin meluncurkan Meld atau tidak, secara default git akan mengeluarkan prompt.


Bagaimana cara saya mengatur dan menggunakan Meld sebagai git mergetool saya?

git mergetool memungkinkan Anda untuk menggunakan program gabungan GUI (mis. Meld) untuk menyelesaikan konflik gabungan yang telah terjadi selama penggabungan.

Seperti halnya difftool, Anda dapat mengatur program GUI pada baris perintah menggunakan -t <tool> / --tool=<tool>tetapi, seperti sebelumnya, lebih masuk akal untuk mengkonfigurasinya dalam .gitconfigfile Anda . [Catatan: Lihat bagian tentang menghindari kutip dan jalur Windows di bagian bawah.]

# Add the following to your .gitconfig file.
[merge]
    tool = meld
[mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

Anda TIDAK gunakan git mergetooluntuk melakukan penggabungan yang sebenarnya. Sebelum menggunakan git mergetoolAnda melakukan penggabungan dengan cara biasa dengan git. misalnya

git checkout master
git merge branch_name

Jika ada konflik git git akan menampilkan sesuatu seperti ini:

$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.

Pada titik ini file_nameakan berisi sebagian file yang digabungkan dengan informasi konflik penggabungan (itu file dengan semua >>>>>>>dan <<<<<<<entri di dalamnya).

Mergetool sekarang dapat digunakan untuk menyelesaikan konflik gabungan. Anda memulainya dengan sangat mudah:

git mergetool

Jika dikonfigurasi dengan benar, jendela Meld akan terbuka menampilkan 3 file. Setiap file akan dimuat dalam panel terpisah dari antarmuka GUI-nya.

Dalam .gitconfigentri contoh di atas, 2 baris disarankan sebagai [mergetool "meld"] cmdbaris. Sebenarnya ada segala macam cara bagi pengguna tingkat lanjut untuk mengkonfigurasi cmdjalur, tetapi itu berada di luar cakupan jawaban ini.

Jawaban ini memiliki 2 cmdjalur alternatif yang, di antaranya, akan melayani sebagian besar pengguna, dan akan menjadi titik awal yang baik bagi pengguna tingkat lanjut yang ingin membawa alat ke tingkat kerumitan berikutnya.

Pertama di sini adalah arti parameter:

  • $LOCAL adalah file di cabang saat ini (mis. master).
  • $REMOTE adalah file dalam cabang yang sedang digabung (misal branch_name).
  • $MERGED adalah file yang sebagian digabungkan dengan informasi konflik gabungan di dalamnya.
  • $BASEadalah leluhur komit bersama $LOCALdan $REMOTE, ini untuk mengatakan file seperti ketika cabang yang berisi $REMOTEawalnya dibuat.

Saya sarankan Anda menggunakan:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"

atau:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
    # See 'Note On Output File' which explains --output "$MERGED".

Pilihannya adalah apakah akan menggunakan $MERGEDatau $BASEdi antara $LOCALdan $REMOTE.

Either way Meld akan menampilkan 3 panel dengan $LOCALdan $REMOTEdi panel kiri dan kanan dan salah satu $MERGEDatau $BASEdi panel tengah.

Dalam KEDUA kasus panel tengah adalah file yang harus Anda edit untuk menyelesaikan konflik gabungan. Perbedaannya hanya di mana posisi edit yang Anda inginkan mulai disukai; $MERGEDuntuk file yang berisi file yang digabung sebagian dengan informasi konflik gabungan atau $BASEuntuk leluhur komit bersama dari $LOCALdan $REMOTE. [Karena kedua cmdbaris ini berguna, saya menyimpannya di .gitconfigfile saya . Sebagian besar waktu saya menggunakan $MERGEDbaris dan $BASEbaris dikomentari, tetapi komentar keluar dapat ditukar jika saya ingin menggunakan $BASEbaris sebagai gantinya.]

Catatan Pada File Keluaran: Jangan khawatir yang --output "$MERGED"digunakan cmdterlepas dari apakah $MERGEDatau $BASEdigunakan sebelumnya di cmdbaris. The --outputpilihan hanya memberitahu Meld apa git nama file ingin file resolusi konflik yang akan disimpan dalam. Meld akan menghemat suntingan konflik Anda dalam file yang terlepas dari apakah Anda menggunakan $MERGEDatau $BASEsebagai titik awal mengedit Anda.

Setelah mengedit panel tengah untuk menyelesaikan konflik gabungan, cukup simpan file dan tutup jendela Meld. Git akan melakukan pembaruan secara otomatis dan file di cabang saat ini (mis. Master) sekarang akan berisi apa pun yang Anda berakhir di panel tengah.

git akan membuat cadangan file yang digabungkan sebagian dengan informasi konflik gabung di dalamnya dengan menambahkan .orignama file aslinya. mis file_name.orig. Setelah memeriksa apakah Anda senang dengan penggabungan dan menjalankan tes apa pun yang mungkin ingin Anda lakukan, .origfile tersebut dapat dihapus.

Pada titik ini Anda sekarang dapat melakukan komit untuk melakukan perubahan.

Jika, saat Anda mengedit konflik gabungan di Meld, Anda ingin mengabaikan penggunaan Meld, lalu keluar dari Meld tanpa menyimpan file resolusi gabungan di panel tengah. git akan merespons dengan pesan file_name seems unchangeddan kemudian bertanya Was the merge successful? [y/n], jika Anda menjawab nmaka resolusi konflik gabungan akan dibatalkan dan file akan tetap tidak berubah. Perhatikan bahwa jika Anda telah menyimpan file di Meld kapan saja maka Anda tidak akan menerima peringatan dan prompt dari git. [Tentu saja kamu bisa menghapus file dan menggantinya dengan .origfile cadangan yang dibuat git untukmu.]

Jika Anda memiliki lebih dari 1 file dengan konflik gabung maka git akan membuka jendela Meld baru untuk masing-masing, satu demi satu hingga semuanya selesai. Semua itu tidak akan dibuka pada saat yang sama, tetapi ketika Anda selesai mengedit konflik dalam satu, dan menutup Meld, git kemudian akan membuka yang berikutnya, dan seterusnya sampai semua konflik gabungan telah diselesaikan.

Akan masuk akal untuk membuat proyek boneka untuk menguji penggunaan git mergetoolsebelum menggunakannya pada proyek langsung . Pastikan untuk menggunakan nama file yang mengandung spasi dalam pengujian Anda, jika OS Anda mengharuskan Anda untuk menghindari tanda kutip di cmdbaris, lihat di bawah.


Melarikan diri dari karakter kutipan

Beberapa sistem operasi mungkin perlu memiliki tanda kutip dalam cmdmelarikan diri. Pengguna yang kurang berpengalaman harus ingat bahwa baris perintah config harus diuji dengan nama file yang menyertakan spasi, dan jika cmdbaris tidak berfungsi dengan nama file yang menyertakan spasi, maka cobalah menghindari tanda kutip. misalnya

cmd = meld \"$LOCAL\" \"$REMOTE\"

Dalam beberapa kasus, pelarian yang lebih kompleks mungkin diperlukan. Tautan jalur Windows 1 di bawah ini berisi contoh tiga-pelarian setiap kutipan. Ini membosankan tetapi terkadang perlu. misalnya

cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"

Jalur Windows

Pengguna Windows mungkin perlu konfigurasi tambahan yang ditambahkan ke cmdjalur Meld . Mereka mungkin perlu menggunakan path lengkap ke meldc, yang dirancang untuk dipanggil pada Windows dari baris perintah, atau mereka mungkin perlu atau ingin menggunakan pembungkus. Mereka harus membaca halaman StackOverflow yang ditautkan di bawah ini tentang pengaturan cmdgaris Meld yang tepat untuk Windows. Karena saya adalah pengguna Linux, saya tidak dapat menguji berbagai cmdjalur Windows dan tidak memiliki informasi lebih lanjut tentang masalah ini selain untuk merekomendasikan menggunakan contoh saya dengan penambahan path lengkap ke Meld atau meldc, atau menambahkan folder program Meld ke Anda path.

Mengabaikan spasi kosong dengan Meld

Meld memiliki sejumlah preferensi yang dapat dikonfigurasi dalam GUI.

Di Text Filterstab preferensi ada beberapa filter berguna untuk mengabaikan hal-hal seperti komentar saat melakukan diff. Meskipun ada filter untuk diabaikan All whitespacedan Leading whitespace, tidak ada Trailing whitespacefilter abaikan (ini telah disarankan sebagai tambahan di milis Meld tetapi tidak tersedia dalam versi saya).

Mengabaikan trailing whitespace seringkali sangat berguna, terutama saat berkolaborasi, dan dapat ditambahkan secara manual dengan mudah dengan ekspresi reguler sederhana di Text Filterstab Preferensi Meld .

# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$

Saya harap ini membantu semua orang.

Mattst
sumber
2
Terima kasih, itu jauh lebih mudah untuk digunakan [mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"dalam ~/.gitconfig, kemudian hanya menyelesaikan konflik disorot dalam merah dalam panci menengah dan menyimpan! Itu harus menjadi pengaturan default.
KrisWebDev
1
$LOCAL $MERGED $REMOTEadalah pengaturan yang saya gunakan sebagian besar waktu, ketika hanya ada beberapa konflik untuk menyelesaikannya sangat baik dan itu adalah standar saya juga. $LOCAL $BASE $REMOTEbenar-benar datang sendiri ketika ada banyak yang harus dilakukan dan Anda tahu persis bagian kode mana yang berasal dari file mana; leluhur komit bersama dapat menjadi titik awal bebas kekacauan yang besar, kadang-kadang konflik yang disorot benar-benar menghalangi dan basis yang lebih bersih adalah berkah.
mattst
4
Catatan: Jika Anda menggunakan OSX dan menginstal berbaur melalui homebrew, parameter output akan membutuhkan =seperti ini:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alteisen
2
Untuk pengguna Mac yang menginstal .dmg dan menemukan bahwa 'meld' tidak ada di jalurnya, pastikan untuk mengikuti serangkaian instruksi alternatif di sini: yousseb.github.io/meld
KC Baltz
3
Itu jauh lebih baik daripada penjelasan di Konfigurasi Git - git mergetool . Terima kasih banyak terutama karena menjelaskan perbedaan antara $ MERGED dan $ BASE. Menyelamatkan saya dari menjadi gila!
ChrisG
81

Sementara jawaban lainnya benar, berikut adalah cara tercepat untuk terus maju dan mengonfigurasi Meld sebagai alat visual diff Anda. Cukup salin / tempel ini:

git config --global diff.tool meld
git config --global difftool.prompt false

Sekarang jalankan git difftooldi direktori dan Meld akan diluncurkan untuk setiap file yang berbeda.

Catatan: Meld secara mengejutkan lambat dalam membandingkan file CSV, dan tidak ada alat berbeda Linux yang saya temukan lebih cepat daripada alat Windows ini yang disebut Bandingkan! (terakhir diperbarui pada 2010).

Dan Dascalescu
sumber
13
Anda mungkin ingin git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'garis di sana juga. Ini adalah "default", tetapi segera setelah Anda mengkonfigurasi a mergetool, difftoolakan mulai menggunakan konfigurasi mergetool sebagai default jika konfigurasi diff tidak ditemukan. Karena penggabungan umumnya dikonfigurasikan untuk melewatkan tiga file untuk penggabungan 3 arah, itu berarti jendela meld diff Anda tiba-tiba memiliki tiga panel yang tidak masuk akal.
BeeOnRope
Mengapa tidak memeriksa konfigurasi, setelah ditetapkan dengan $ git config -l
agfe2
56

Untuk Windows . Jalankan perintah ini di Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global mergetool.prompt false

(Perbarui jalur file untuk Meld.exe jika milik Anda berbeda.)

Untuk Linux . Jalankan perintah ini di Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

Anda dapat memverifikasi jalur Meld menggunakan perintah ini:

which meld
MarredCheese
sumber
1
Saya mendapat kesalahan ketika menjalankan git difftool "Alat diff berbaur tidak tersedia sebagai 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork
@ AllenVork: Sudahkah Anda mengonfirmasi bahwa Meld.exe ada di folder yang Anda tentukan? Bisakah Anda menjalankannya di luar Git dengan sukses? Apa yang dikembalikan Git saat Anda menjalankan git config --global --get-regex diff*?
MarredCheese
Saya menyelesaikannya. Saya mengubahnya ke "D: /software/melddiff/Meld.exe" dan berfungsi. Format .gitconfig adalah ubuntu bukan windows.
Allen Vork
Seharusnya tidak itu telah: git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"?
Jonathan Rosenne
@ AllenVork, apakah Anda menggunakan git untuk cygwin?
Adrian
25

Saya lebih suka mensetup berbaur sebagai perintah terpisah, seperti:

git config --global alias.meld '!git difftool -t meld --dir-diff'

Ini membuatnya mirip dengan skrip git-meld.pl di sini: https://github.com/wmanley/git-meld

Anda kemudian bisa lari

git meld
Ulf Adams
sumber
Saya baru saja berbaur bekerja dengan Cygwin, dan sekarang sudah bangkrut. Ini memperbaikinya. Terima kasih! (Meskipun saya menghapus --dir-diffbagian itu sebagai preferensi pribadi.)
PfunnyGuy
3

Untuk Windows 10 saya harus meletakkan ini di .gitconfig saya:

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

Segala sesuatu yang perlu Anda ketahui tertulis dalam jawaban super ini oleh mattst lebih lanjut di atas.

PS: Untuk beberapa alasan, ini hanya bekerja dengan Meld 3.18.x, Meld 3.20.x memberi saya kesalahan.

Jeremy Benks
sumber
1

Ini adalah jawaban yang menargetkan terutama pengembang yang menggunakan Windows, karena sintaks jalur alat yang berbeda dari platform lain.

Saya menggunakan Kdiff3 sebagai git mergetool, tetapi untuk mengatur git difftool sebagai Meld, saya pertama kali menginstal versi terbaru Meld dari Meldmerge.org kemudian menambahkan yang berikut ke global .gitconfig menggunakan:

git config --global -e

Catatan, jika Anda lebih suka Sublime Text 3 daripada Vim default sebagai core ditor, Anda dapat menambahkan ini ke file .gitconfig:

[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'

Lalu kamu tambahkan inn Meld sebagai difftool

[diff]
tool = meld
guitool = meld 

[difftool "meld"]
cmd = \"C:/Program Files (x86)/Meld/Meld.exe\" \"$LOCAL\" \"$REMOTE\" --label \"DIFF 
(ORIGINAL MY)\"
prompt = false
path = C:\\Program Files (x86)\\Meld\\Meld.exe

Perhatikan slash terkemuka di cmd di atas, pada Windows itu perlu.

Dimungkinkan juga untuk mengatur alias untuk menampilkan git diff saat ini dengan opsi --dir-diff . Ini akan mencantumkan file yang diubah di dalam Meld, yang berguna saat Anda telah mengubah banyak file (memang skenario yang sangat umum).

Alias ​​terlihat seperti ini di dalam file .gitconfig, di bawah bagian [alias] :

showchanges = difftool --dir-diff

Untuk menunjukkan perubahan yang saya buat pada kode, saya kemudian cukup memasukkan perintah berikut:

git showchanges

Gambar berikut menunjukkan bagaimana opsi --dir-diff ini dapat menampilkan daftar file yang diubah (contoh): Meld menampilkan daftar file dengan perubahan antara $ LOCAL dan $ REMOTE

Maka dimungkinkan untuk mengklik pada setiap file dan menunjukkan perubahan di dalam Meld.

Tore Aurstad
sumber
0

Mungkin rumit untuk menghitung diff di kepala Anda dari bagian yang berbeda di $ MERGED dan menerapkannya. Dalam pengaturan saya, berbaur membantu dengan menunjukkan kepada Anda perbedaan ini secara visual, menggunakan:

[merge]
    tool = mymeld
    conflictstyle = diff3

[mergetool "mymeld"]
    cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED

Itu terlihat aneh tetapi menawarkan alur kerja yang sangat nyaman, menggunakan tiga tab:

  1. di tab 1 Anda melihat (dari kiri ke kanan) perubahan yang harus Anda buat di tab 2 untuk menyelesaikan konflik gabungan.

  2. di sisi kanan tab 2 Anda menerapkan "perubahan yang harus Anda buat" dan menyalin seluruh isi file ke clipboard (menggunakan ctrl-a dan ctrl-c).

  3. pada tab 3 ganti sisi kanan dengan konten clipboard. Jika semuanya benar, sekarang Anda akan melihat - dari kiri ke kanan - perubahan yang sama seperti yang ditunjukkan pada tab 1 (tetapi dengan konteks yang berbeda). Simpan perubahan yang dibuat di tab ini.

Catatan:

  • jangan edit apa pun di tab 1
  • jangan menyimpan apa pun di tab 2 karena itu akan menghasilkan popup yang mengganggu di tab 3
mnieber
sumber
Apakah ini lebih baik dari gabungan 3 arah (lokal / basis / jarak jauh) dalam satu tab?
André Werlang
@ AndréWerlang Keuntungan dari penggabungan 3-cara dalam satu tab adalah Anda hanya perlu berurusan dengan perubahan yang bertentangan (perubahan lainnya digabungkan secara otomatis). Tapi saya lebih suka pendekatan "saya" dalam kasus-kasus di mana sulit untuk memahami dalam 3-cara menggabungkan apa yang berubah, dan bagaimana menggabungkan dengan cara yang mempertahankan semua perubahan. Jika suatu saat penggabungan 3-arah tidak lagi membingungkan saya, maka saya dapat kembali ke sana.
mnieber
Seperti yang ditunjukkan pengguna mattst, Anda dapat menggunakan $BASEalih-alih $MERGEDmemulai operasi penggabungan
André Werlang