Menyelesaikan konflik lewat editor teks sepenuhnya memadai — sampai merge yang macet menyentuh dua belas berkas dengan puluhan blok konflik di tiap berkasnya. Menyunting penanda <<<<<<< satu per satu di kondisi seperti itu melelahkan dan rawan salah potong. Git punya jembatan keluar: git mergetool, perintah yang membuka aplikasi eksternal khusus penggabungan tiga arah. Chapter ini membahas cara kerjanya, cara melihat daftar tool yang didukung, cara mengatur VS Code sebagai tool — cukup lewat konfigurasi, tanpa perlu menjalankan antarmuka grafisnya di sini — serta kapan tool benar-benar sepadan dibanding menyunting manual. Dokumentasi resminya: git-scm.com/docs/git-mergetool
.
Cara Kerja git mergetool #
Saat konflik, Git diam-diam menyimpan tiga versi tiap berkas yang tabrakan di dalam index: versi dasar, versi sisi kita, versi sisi seberang. git mergetool memanfaatkan ketiganya: perintah ini membuka tool eksternal dengan empat peran — $LOCAL (versi kita), $REMOTE (versi seberang), $BASE (versi dasar), dan $MERGED (berkas hasil yang akan ditulis). Sebagian besar tool menggambarkannya sebagai tiga panel berdampingan: kiri dan kanan dua sisi yang berseteru, di tengah atau di panel keempat hasil akhir yang bisa kita rakit dengan klik.
Alur pemakaiannya pendek: saat konflik muncul (chapter Merge Conflicts
), jalankan git mergetool tanpa argumen. Git membuka tool untuk berkas konflik pertama; setelah tool ditutup dan resolusi dianggap berhasil, berkas ditandai selesai (masuk staging otomatis), lalu Git lanjut ke berkas konflik berikutnya. Satu putaran penuh berakhir seperti penyelesaian manual di chapter Menyelesaikan Merge Conflicts
— tinggal satu git commit untuk menutup merge.
Melihat Daftar Tool yang Didukung #
Tool bawaan yang dikenali Git bisa dikeruk lewat --tool-help. Keluaran berikut dieksekusi nyata di mesin uji (Git 2.47.3), dipotong di bagian daftar yang panjang:
git mergetool --tool-helpOutput yang Dihasilkan:
'git mergetool --tool=<tool>' may be set to one of the following:
vimdiff Use Vim with a custom layout (see `git help mergetool`'s `BACKEND SPECIFIC HINTS` section)
vimdiff1 Use Vim with a 2 panes layout (LOCAL and REMOTE)
vimdiff2 Use Vim with a 3 panes layout (LOCAL, MERGED and REMOTE)
vimdiff3 Use Vim where only the MERGED file is shown
The following tools are valid, but not currently available:
(dipotong)
araxis Use Araxis Merge (requires a graphical session)
bc Use Beyond Compare (requires a graphical session)
(dipotong)
kdiff3 Use KDiff3 (requires a graphical session)
meld Use Meld (requires a graphical session) with optional `auto merge` (see `git help mergetool`'s `CONFIGURATION` section)
(dipotong)
vscode Use Visual Studio Code (requires a graphical session)
winmerge Use WinMerge (requires a graphical session)
(dipotong)
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.Daftarnya terbagi dua kelompok. Kelompok pertama — may be set to one of the following — adalah tool yang siap dipakai saat itu juga; di mesin uji hanya keluarga vimdiff, yang berjalan di terminal. Kelompok kedua — valid, but not currently available — tool yang Git kenali konfigurasinya tetapi tidak terpasang atau butuh sesi grafis: Araxis, Beyond Compare, KDiff3, Meld, sampai VS Code dan WinMerge. Mesin pembaca akan menampilkan susunan serupa dengan isi yang menyesuaikan aplikasi terpasang.
Menyiapkan Tool: Contoh VS Code #
Pemilihan tool disimpan di konfigurasi merge.tool, dan tiap tool punya baris perintah panggilannya sendiri. Contoh resmi untuk VS Code:
cd latihan-mergetool
git config merge.tool vscode
git config mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
git config mergetool.keepBackup false
git config --get-regexp 'merge'Output yang Dihasilkan (perintah git config --get-regexp 'merge'):
merge.tool vscode
mergetool.vscode.cmd code --wait --merge $REMOTE $LOCAL $BASE $MERGED
mergetool.keepbackup falseTiga baris konfigurasi itu perlu dibedah satu per satu:
merge.tool vscode— nama tool pilihan; saatgit mergetooldijalankan, Git mencari baris perintah dimergetool.vscode.cmd.mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'— perintah yang dijalankan Git, dengan empat variabel diganti berkas versi masing-masing. Urutan$REMOTE $LOCAL $BASE $MERGEDadalah urutan yang dibaca mode--mergemilik VS Code; flag--waitmembuat Git menunggu jendela editor ditutup sebelum melanjutkan — tanpa flag itu, Git akan menganggap resolusi selesai begitu prosescodeberjalan.mergetool.keepBackup false— secara defaultgit mergetoolmeninggalkan berkas cadangan berekstensi.origsetelah resolusi. Nilaifalsemembuang cadangan itu otomatis setelah resolusi berhasil, sehingga working tree tidak bertaburanREADME.md.orig. Satu catatan kecil: kunci konfigurasi Git tidak peka huruf besar-kecil, jadi keluaran--get-regexpmenampilkannya sebagaimergetool.keepbackup.
Konfigurasi ini bisa dipasang kapan saja — bahkan saat tidak ada konflik — dan bisa pula dipasang global dengan git config --global agar berlaku untuk semua repository.
Kapan Tool Membantu, Kapan Manual #
| Situasi | Pilihan yang lebih pas | Alasannya |
|---|---|---|
| Konflik 1-3 berkas, perubahan kecil | Menyunting manual | Membuka tool lebih lama daripada memotong penanda langsung |
| Konflik banyak berkas, blok panjang | git mergetool | Panel tiga sisi memperlihatkan kedua versi sekaligus tanpa lompat-lompat |
| Bekerja lewat SSH ke server tanpa GUI | vimdiff atau manual | Tool GUI membutuhkan sesi berjendela; vimdiff hidup di terminal |
| Ingin kendali penuh atas hasil akhir | Menyunting manual atau --ours/--theirs | Hasil tool tetap perlu diperiksa sebelum commit |
Pilihan tool tidak mengubah hukum akhir: hasil resolusi harus bersih dari penanda, ditandai selesai, lalu di-commit. Yang berubah cuma kenyamanan perjalanan. Dan bila resolusi yang muncul justru salah arah — misalnya kita sadar merge itu sendiri tidak seharusnya dijalankan — Git masih menyediakan pintu darurat untuk membatalkan seluruh penggabungan, baik sebelum maupun sesudah commit: Membatalkan Merge .