Konflik Hapus vs Ubah: UD dan DU
Selesaikan konflik saat satu pihak menghapus file dan pihak lain mengubahnya, kenali status UD/DU dan cara resolve-nya.
Skenario yang bikin bingung
Konflik biasa terjadi saat dua pihak mengubah baris yang sama. Tapi ada jenis yang lebih membingungkan: satu pihak MENGHAPUS file, pihak lain MENGUBAH file yang sama. Git tidak bisa menebak niatmu: apakah file ini seharusnya hilang, atau perubahan pihak satunya harus dipertahankan? Jadi Git berhenti dan menyerahkan keputusan padamu. Kenapa Git tidak memilih sendiri? Karena dua niat itu sama-sama valid, dan tebakan yang salah berarti menghapus pekerjaan orang.
Melihat status UD dan DU
git status --shortContoh output saat konflik:
UD catatan-lama.md
DU arsip.txtDua huruf itu dibaca sebagai pasangan (index, working tree). UD artinya: Updated by them, Deleted by us, file diubah pihak lain tapi dihapus di pihakmu. DU artinya sebaliknya: Deleted by them, Updated by us, file dihapus pihak lain tapi diubah di pihakmu. Mnemonic-nya: huruf pertama status di index, huruf kedua status di working tree.
Pesan Git saat merge juga menjelaskannya dengan kata-kata:
CONFLICT (modify/delete): arsip.txt deleted in HEAD and modified in fitur.Cara resolve: dua pilihan, dua perintah
Keputusan pertama: apakah file ini harus TETAP ADA atau BOLEH HILANG?
Pertahankan file (menangkan pihak yang mengubah):
git add arsip.txtgit add pada file berstatus UD/DU memberitahu Git: "aku memilih versi yang diubah, file tetap ada." Tidak ada marker konflik di dalam file yang perlu diedit, karena konfliknya soal keberadaan file, bukan isi baris.
Terima penghapusan (menangkan pihak yang menghapus):
git rm arsip.txtgit rm memberitahu Git: "setuju, file ini memang harus hilang." Setelah semua file konflik diputuskan, selesaikan merge:
git commitContoh sesi lengkap:
git merge fitur
# CONFLICT (modify/delete): arsip.txt deleted in HEAD and modified in fitur.
git status --short
# DU arsip.txt
git add arsip.txt # keputusanku: file tetap ada
git commit -m "Merge fitur, pertahankan arsip.txt"Kapan skenario ini muncul
Kasus paling sering: bersih-bersih kode. Kamu menghapus file yang dikira tidak dipakai, ternyata rekanmu sedang mengembangkannya di branch lain. Atau sebaliknya: kamu refactor file lama sementara orang lain menghapusnya karena mengira sudah mati. Konflik ini sebenarnya sinyal komunikasi: dua orang punya asumsi berbeda tentang nasib satu file. Setelah resolve, ada baiknya ngobrol dengan rekanmu supaya tidak terulang.
Kesalahan umum pemula
Salah: melihat status DU lalu asal pilih git rm supaya merge cepat selesai, tanpa memeriksa dulu perubahan apa yang dibuang.
Benar: sebelum memutuskan, lihat dulu perubahannya dengan git diff HEAD...MERGE_HEAD -- arsip.txt atau buka versi pihak lain. Keputusan hapus itu permanen dan bisa membuang kerjaan orang.
Salah: mengira konflik modify/delete bisa diselesaikan dengan mengedit marker <<<<<<< di dalam file seperti konflik biasa.
Benar: tidak ada marker di dalam file untuk jenis konflik ini. Resolusi hanya lewat git add (pertahankan) atau git rm (hapus). Kalau kamu membuka file dan tidak menemukan marker, itu normal, bukan error.
Tantangan
Rekayasa konflik hapus vs ubah
Buat branch A yang menghapus sebuah file dan branch B yang mengubah file yang sama, lalu merge hingga konflik. Identifikasi status UD atau DU-nya, resolve dengan git add, dan selesaikan merge dengan commit.