Strategi Merge: Recursive, Ours, Octopus
Mengenal strategi merge Git dan kapan memakai ours, theirs, atau octopus.
Merge tidak selalu "recursive"
Saat kamu menjalankan git merge, Git sebenarnya MEMILIH strategi penggabungan. Defaultnya recursive (atau ort di Git versi baru): cari ancestor bersama kedua branch, lalu gabungkan perubahan dari kedua sisi baris per baris. Untuk 99% kasus, inilah yang kamu mau dan tidak perlu diubah.
KENAPA ada banyak strategi? Karena "menggabungkan" beda arti tergantung niatmu: menyatukan isi kedua sisi, memenangkan satu sisi total, atau menggabungkan banyak branch sekaligus.
Strategi ours: menutup branch tanpa mengambil isinya
git merge -s ours fitur-lamaContoh 1: branch fitur-lama berisi eksperimen yang dibatalkan tim. Kodenya tidak boleh masuk main, tapi riwayat harus mencatat branch itu pernah ada dan resmi ditutup.
git switch main
git merge -s ours fitur-lama
git log --oneline -2m1a2b3c Merge branch 'fitur-lama'
a3f9c1d Commit terakhir mainHasil merge 100% mengikuti branch-mu; perubahan branch lawan dibuang total, TAPI riwayat tetap mencatatnya "sudah digabung". KAPAN dipakai? Untuk branch kedaluwarsa yang idenya dibatalkan.
Trade-off: riwayat tetap jujur dan lengkap. Risikonya FATAL kalau salah pakai: seluruh isi branch lawan hilang diam-diam tanpa konflik dan tanpa peringatan. Aturan praktis: pakai -s ours hanya kalau 100% yakin tak satu baris pun dari branch itu dibutuhkan.
Opsi -X theirs / -X ours: otomatis menangkan satu sisi
git merge -X theirs fiturContoh 2: tim menyetujui rewrite besar di branch fitur, dan kamu yakin versinya lebih benar di SEMUA titik konflik. Opsi ini otomatis memenangkan versi branch yang di-merge di setiap konflik, tanpa resolve manual puluhan kali.
Penting: ini BUKAN strategi, melainkan opsi strategi. Bedanya besar:
-s ours(strategi): abaikan SELURUH isi branch lawan, bahkan yang tidak konflik.-X ours(opsi): tetap gabungkan normal, tapi menangkan versimu di tiap titik KONFLIK saja. Baris yang tidak konflik tetap digabung dari kedua sisi.
KAPAN dipakai? -X theirs saat satu sisi jelas sumber kebenaran seluruh konflik (rewrite yang disetujui, branch hasil regenerate tool). -X ours saat branch-mu paling up-to-date dan branch lawan hanya berisi perubahan kecil.
Trade-off: puluhan konflik selesai dalam satu perintah, tapi kamu tidak pernah MELIHAT apa yang dikalahkan. Satu baris penting bisa hilang tanpa sadar. Jangan pakai sebelum membaca git diff main...fitur dan memahami taruhannya.
Octopus: merge banyak branch sekaligus
git merge fitur-a fitur-b fitur-cContoh 3: kamu release manager menggabungkan tiga fitur yang sudah di-review. Tanpa konflik, Git otomatis memakai strategi octopus: SATU merge commit dengan banyak parent.
KAPAN dipakai? Menggabungkan beberapa branch tak bersinggungan dalam satu langkah, supaya riwayat rilis punya satu titik "semua fitur masuk bersamaan".
Trade-off: satu commit rilis yang rapi, tapi octopus MENOLAK jalan kalau ada konflik sedikit pun (tidak ada resolve manual di tengahnya). Hanya untuk kasus yang sudah diverifikasi bersih; kalau konflik, gabungkan satu per satu.
Kesalahan umum: salah vs benar
SALAH: memakai -s ours padahal maksudnya -X ours.
git merge -s ours fitur # MENGHAPUS seluruh isi fitur diam-diamNiatnya "menangkan versiku kalau konflik", tapi seluruh branch fitur dibuang total.
BENAR: pahami dulu bedanya sebelum mengetik. Kalau niatnya hanya memenangkan konflik, pakai opsi:
git merge -X ours fitur # gabung normal, menangkan versiku per konflikSALAH: bereksperimen dengan strategi merge di branch bersama untuk "coba-coba".
BENAR: coba di clone lokal dulu, verifikasi dengan git diff dan git log --graph, baru terapkan di repo bersama. Alat tajam: kuat di tangan yang paham, berbahaya di tangan yang menebak-nebak.
Catatan teknis: jujur, sebagian besar developer tidak pernah keluar dari strategi default sepanjang kariernya. Tapi saat kamu jadi orang yang merapikan riwayat rilis atau menutup branch kedaluwarsa, pengetahuan ini membedakan "bisa Git" dengan "paham Git".
Tantangan
Bedakan -s dan -X
Tanpa menjalankan perintahnya, jelaskan dengan kata-katamu: apa beda git merge -s ours fitur dengan git merge -X ours fitur? Kapan masing-masing berbahaya jika dipakai sembarangan?