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.
Jawaban:
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.gitconfig
file Anda . [Catatan: Lihat bagian tentang menghindari kutip dan jalur Windows di bagian bawah.][Catatan: Pengaturan ini tidak akan mengubah perilaku
git diff
yang akan terus berfungsi seperti biasa.]Anda menggunakan
git difftool
dengan cara yang persis sama seperti yang Anda gunakangit diff
. misalnyaJika dikonfigurasi dengan benar jendela Meld akan terbuka menampilkan diff menggunakan antarmuka GUI.
Urutan panel jendela MUI GUI dapat dikontrol dengan urutan
$LOCAL
dan$REMOTE
masukcmd
, artinya file mana yang ditampilkan di panel kiri dan yang di panel kanan. Jika Anda menginginkannya sebaliknya, tukar saja seperti ini:Akhirnya
prompt = false
saluran 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.gitconfig
file Anda . [Catatan: Lihat bagian tentang menghindari kutip dan jalur Windows di bagian bawah.]Anda TIDAK gunakan
git mergetool
untuk melakukan penggabungan yang sebenarnya. Sebelum menggunakangit mergetool
Anda melakukan penggabungan dengan cara biasa dengan git. misalnyaJika ada konflik git git akan menampilkan sesuatu seperti ini:
Pada titik ini
file_name
akan 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:
Jika dikonfigurasi dengan benar, jendela Meld akan terbuka menampilkan 3 file. Setiap file akan dimuat dalam panel terpisah dari antarmuka GUI-nya.
Dalam
.gitconfig
entri contoh di atas, 2 baris disarankan sebagai[mergetool "meld"]
cmd
baris. Sebenarnya ada segala macam cara bagi pengguna tingkat lanjut untuk mengkonfigurasicmd
jalur, tetapi itu berada di luar cakupan jawaban ini.Jawaban ini memiliki 2
cmd
jalur 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.$BASE
adalah leluhur komit bersama$LOCAL
dan$REMOTE
, ini untuk mengatakan file seperti ketika cabang yang berisi$REMOTE
awalnya dibuat.Saya sarankan Anda menggunakan:
atau:
Pilihannya adalah apakah akan menggunakan
$MERGED
atau$BASE
di antara$LOCAL
dan$REMOTE
.Either way Meld akan menampilkan 3 panel dengan
$LOCAL
dan$REMOTE
di panel kiri dan kanan dan salah satu$MERGED
atau$BASE
di 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;
$MERGED
untuk file yang berisi file yang digabung sebagian dengan informasi konflik gabungan atau$BASE
untuk leluhur komit bersama dari$LOCAL
dan$REMOTE
. [Karena keduacmd
baris ini berguna, saya menyimpannya di.gitconfig
file saya . Sebagian besar waktu saya menggunakan$MERGED
baris dan$BASE
baris dikomentari, tetapi komentar keluar dapat ditukar jika saya ingin menggunakan$BASE
baris sebagai gantinya.]Catatan Pada File Keluaran: Jangan khawatir yang
--output "$MERGED"
digunakancmd
terlepas dari apakah$MERGED
atau$BASE
digunakan sebelumnya dicmd
baris. The--output
pilihan 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$MERGED
atau$BASE
sebagai 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
.orig
nama file aslinya. misfile_name.orig
. Setelah memeriksa apakah Anda senang dengan penggabungan dan menjalankan tes apa pun yang mungkin ingin Anda lakukan,.orig
file 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 unchanged
dan kemudian bertanyaWas the merge successful? [y/n]
, jika Anda menjawabn
maka 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.orig
file 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 mergetool
sebelum menggunakannya pada proyek langsung . Pastikan untuk menggunakan nama file yang mengandung spasi dalam pengujian Anda, jika OS Anda mengharuskan Anda untuk menghindari tanda kutip dicmd
baris, lihat di bawah.Melarikan diri dari karakter kutipan
Beberapa sistem operasi mungkin perlu memiliki tanda kutip dalam
cmd
melarikan diri. Pengguna yang kurang berpengalaman harus ingat bahwa baris perintah config harus diuji dengan nama file yang menyertakan spasi, dan jikacmd
baris tidak berfungsi dengan nama file yang menyertakan spasi, maka cobalah menghindari tanda kutip. misalnyaDalam 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
Jalur Windows
Pengguna Windows mungkin perlu konfigurasi tambahan yang ditambahkan ke
cmd
jalur Meld . Mereka mungkin perlu menggunakan path lengkap kemeldc
, 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 pengaturancmd
garis Meld yang tepat untuk Windows. Karena saya adalah pengguna Linux, saya tidak dapat menguji berbagaicmd
jalur Windows dan tidak memiliki informasi lebih lanjut tentang masalah ini selain untuk merekomendasikan menggunakan contoh saya dengan penambahan path lengkap ke Meld ataumeldc
, atau menambahkan folder program Meld ke Andapath
.Mengabaikan spasi kosong dengan Meld
Meld memiliki sejumlah preferensi yang dapat dikonfigurasi dalam GUI.
Di
Text Filters
tab preferensi ada beberapa filter berguna untuk mengabaikan hal-hal seperti komentar saat melakukan diff. Meskipun ada filter untuk diabaikanAll whitespace
danLeading whitespace
, tidak adaTrailing whitespace
filter 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 Filters
tab Preferensi Meld .Saya harap ini membantu semua orang.
sumber
[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.$LOCAL $MERGED $REMOTE
adalah pengaturan yang saya gunakan sebagian besar waktu, ketika hanya ada beberapa konflik untuk menyelesaikannya sangat baik dan itu adalah standar saya juga.$LOCAL $BASE $REMOTE
benar-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.=
seperti ini:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Sementara jawaban lainnya benar, berikut adalah cara tercepat untuk terus maju dan mengonfigurasi Meld sebagai alat visual diff Anda. Cukup salin / tempel ini:
Sekarang jalankan
git difftool
di 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).
sumber
git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'
garis di sana juga. Ini adalah "default", tetapi segera setelah Anda mengkonfigurasi amergetool
,difftool
akan 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 jendelameld
diff Anda tiba-tiba memiliki tiga panel yang tidak masuk akal.Untuk Windows . Jalankan perintah ini di Git Bash:
(Perbarui jalur file untuk Meld.exe jika milik Anda berbeda.)
Untuk Linux . Jalankan perintah ini di Git Bash:
Anda dapat memverifikasi jalur Meld menggunakan perintah ini:
sumber
git config --global --get-regex diff*
?git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
?Saya lebih suka mensetup berbaur sebagai perintah terpisah, seperti:
Ini membuatnya mirip dengan skrip git-meld.pl di sini: https://github.com/wmanley/git-meld
Anda kemudian bisa lari
sumber
--dir-diff
bagian itu sebagai preferensi pribadi.)Untuk Windows 10 saya harus meletakkan ini di .gitconfig saya:
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.
sumber
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:
Catatan, jika Anda lebih suka Sublime Text 3 daripada Vim default sebagai core ditor, Anda dapat menambahkan ini ke file .gitconfig:
Lalu kamu tambahkan inn Meld sebagai difftool
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] :
Untuk menunjukkan perubahan yang saya buat pada kode, saya kemudian cukup memasukkan perintah berikut:
Gambar berikut menunjukkan bagaimana opsi --dir-diff ini dapat menampilkan daftar file yang diubah (contoh):
Maka dimungkinkan untuk mengklik pada setiap file dan menunjukkan perubahan di dalam Meld.
sumber
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:
Itu terlihat aneh tetapi menawarkan alur kerja yang sangat nyaman, menggunakan tiga tab:
di tab 1 Anda melihat (dari kiri ke kanan) perubahan yang harus Anda buat di tab 2 untuk menyelesaikan konflik gabungan.
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).
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:
sumber
$BASE
alih-alih$MERGED
memulai operasi penggabungan