1. Membaca Penanda Konflik
function hitungTotal(item) {
<<<<<<< HEAD
return item.harga * item.jumlah * 1.11; // versi di branch Anda
=======
return item.harga * item.jumlah * 1.12; // versi dari branch yang di-merge
>>>>>>> fitur/pajak-baru
}
- Antara
<<<<<<<dan=======adalah versi branch tempat Anda berada sekarang (HEAD). - Antara
=======dan>>>>>>>adalah versi branch yang sedang digabungkan.
2. Aktifkan diff3 — Ini Mengubah Segalanya
git config --global merge.conflictstyle zdiff3
Dengan pengaturan ini, Git juga menampilkan versi asli sebelum kedua pihak mengubahnya:
<<<<<<< HEAD return item.harga * item.jumlah * 1.11; ||||||| leluhur bersama return item.harga * item.jumlah; <-- ASLINYA begini ======= return item.harga * item.jumlah * 1.12; >>>>>>> fitur/pajak-baru
Tanpa versi leluhur, Anda hanya melihat dua jawaban berbeda tanpa tahu apa yang masing-masing pihak sebenarnya ubah. Dengan diff3 terlihat jelas: satu pihak menambahkan pajak 11%, pihak lain menambahkan 12%. Keputusannya jadi soal bisnis, bukan tebak-tebakan kode.
3. Alur Penyelesaian
# Lihat berkas mana saja yang konflik git status git diff --name-only --diff-filter=U # Setelah menyunting dan menghapus SEMUA penanda konflik: git add src/harga.js git status # pastikan tidak ada yang tersisa git commit # Git sudah menyiapkan pesan merge # Membatalkan seluruh proses merge dan kembali seperti semula git merge --abort
Lupa menghapus salah satu penanda ======= atau >>>>>>>, lalu commit. Kode menjadi rusak dan pipeline CI gagal dengan pesan yang membingungkan. Sebelum commit, cari sisa penanda:
git diff --check grep -rn "<<<<<<<\|>>>>>>>\|=======" .
4. Mengambil Salah Satu Sisi Secara Utuh
# Ambil versi branch Anda untuk berkas ini git checkout --ours berkas-lock.json # Ambil versi branch yang di-merge git checkout --theirs paket-baru.json git add berkas-lock.json paket-baru.json
Saat merge, ours adalah branch Anda. Saat rebase, Git memutar ulang commit Anda di atas branch tujuan, sehingga ours justru merujuk pada branch tujuan dan theirs adalah commit Anda sendiri. Ini membalik intuisi banyak orang — periksa dua kali sebelum memakainya saat rebase.
5. rerere — Git Mengingat Penyelesaian Anda
git config --global rerere.enabled true
Reuse Recorded Resolution: Git menyimpan cara Anda menyelesaikan sebuah konflik. Bila konflik yang persis sama muncul lagi — dan ini sangat sering terjadi saat rebase berulang atau memelihara branch berumur panjang — Git menerapkannya otomatis.
git rerere status # konflik apa yang sedang direkam git rerere diff # penyelesaian apa yang sedang berlaku git rerere forget berkas.js # lupakan rekaman untuk berkas ini
6. Konflik pada Berkas yang Dihasilkan Mesin
Berkas seperti package-lock.json, yarn.lock, atau go.sum hampir selalu konflik dan tidak layak diselesaikan baris per baris.
# Jangan sunting manual -- bangun ulang saja git checkout --theirs package-lock.json npm install git add package-lock.json
# Cegah Git mencoba menggabungkan berkas yang tidak bisa di-merge *.png binary *.pdf binary *.xlsx binary # Selalu ambil versi kita untuk berkas tertentu CHANGELOG.md merge=ours
7. Mencegah Lebih Baik daripada Menyelesaikan
- Branch berumur pendek. Branch yang hidup dua hari jarang konflik; yang hidup dua bulan hampir pasti konflik berat. Ini penyebab konflik nomor satu.
- Sering menarik dari main. Jalankan
git fetch origin && git rebase origin/mainsetiap pagi, sehingga Anda menghadapi konflik kecil setiap hari alih-alih satu konflik raksasa di akhir. - Pisahkan tanggung jawab berkas. Konflik struktural sering merupakan gejala arsitektur: kalau dua tim selalu mengubah berkas yang sama, berkas itu mungkin mengerjakan terlalu banyak hal.
- Sepakati format kode. Formatter otomatis seperti Prettier atau gofmt menghilangkan seluruh kelas konflik yang cuma soal spasi dan tanda kurung.
- Pull request kecil. Perubahan 200 baris di-review dengan teliti dan jarang konflik; perubahan 3.000 baris hanya diberi stempel setuju dan penuh konflik.