Kodeloka
  1. Kodeloka
  2. Kelas Git & CI/CD
  3. Materi

Git Fundamentals · Modul 3 dari 20

Menyelesaikan Konflik Merge dengan Percaya Diri

Membaca penanda konflik, memakai gaya diff3, memanfaatkan rerere, dan strategi mencegah konflik sejak awal.

1. Membaca Penanda Konflik

src/harga.js
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
📌 Kenapa ini sangat membantu

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
🚫 Kesalahan paling sering

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
⚠️ Arti "ours" terbalik saat rebase

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
.gitattributes — menandai berkas biner
# 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/main setiap 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.