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:

bash
git mergetool --tool-help

Output yang Dihasilkan:

text
'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:

bash
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'):

text
merge.tool vscode
mergetool.vscode.cmd code --wait --merge $REMOTE $LOCAL $BASE $MERGED
mergetool.keepbackup false

Tiga baris konfigurasi itu perlu dibedah satu per satu:

  1. merge.tool vscode — nama tool pilihan; saat git mergetool dijalankan, Git mencari baris perintah di mergetool.vscode.cmd.
  2. 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 $MERGED adalah urutan yang dibaca mode --merge milik VS Code; flag --wait membuat Git menunggu jendela editor ditutup sebelum melanjutkan — tanpa flag itu, Git akan menganggap resolusi selesai begitu proses code berjalan.
  3. mergetool.keepBackup false — secara default git mergetool meninggalkan berkas cadangan berekstensi .orig setelah resolusi. Nilai false membuang cadangan itu otomatis setelah resolusi berhasil, sehingga working tree tidak bertaburan README.md.orig. Satu catatan kecil: kunci konfigurasi Git tidak peka huruf besar-kecil, jadi keluaran --get-regexp menampilkannya sebagai mergetool.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 #

SituasiPilihan yang lebih pasAlasannya
Konflik 1-3 berkas, perubahan kecilMenyunting manualMembuka tool lebih lama daripada memotong penanda langsung
Konflik banyak berkas, blok panjanggit mergetoolPanel tiga sisi memperlihatkan kedua versi sekaligus tanpa lompat-lompat
Bekerja lewat SSH ke server tanpa GUIvimdiff atau manualTool GUI membutuhkan sesi berjendela; vimdiff hidup di terminal
Ingin kendali penuh atas hasil akhirMenyunting manual atau --ours/--theirsHasil 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 .