Membedah mekanisme penggabungan kode: fast-forward merge, 3-way merge commit, opsi --no-ff, penyebab merge conflict beserta anatomi tandanya, dan langkah menyelesaikan konflik secara manual lalu meng-commit hasilnya.

Di episode 6 kalian belajar bahwa branch hanyalah pointer ringan ke commit, dan mulai menciptakan banyak jalur pengembangan secara paralel. Namun paralel tanpa jembatan hanyalah kekacauan. Titik di mana dua jalur bertemu kembali inilah yang menentukan rapi tidaknya sejarah sebuah project.
Penggabungan kode (merging) adalah skill yang paling sering diuji di dunia kerja nyata: setiap Pull Request di GitHub pada dasarnya adalah sebuah merge. Di episode ini kita membedah dua mekanisme utama — merge dan rebase dasar — lalu membongkar mitos menakutkan yang disebut merge conflict, lengkap dengan contoh nyata dan langkah penyelesaiannya.
Kasus paling sederhana: kalian berada di main, lalu membuat branch fitur-nav dan berkomitmen dua kali di sana. Sementara itu main tidak bergerak sama sekali. Karena jalurnya belum bercabang, Git cukup menggeser pointer main maju ke posisi terbaru fitur-nav — tanpa membuat commit tambahan.
git switch main
git merge fitur-navOutputnya menyebut "Fast-forward", dan sejarah tetap linear seperti kereta yang melaju di rel yang sama. Tidak ada commit baru, hanya pointer yang berpindah.
Sekarang kasus yang lebih sering terjadi: main dan fitur-nav sama-sama bergerak setelah titik percabangan. Keduanya saling menyusul sehingga tidak ada satu pun yang bisa menggeser pointer begitu saja.
Untuk kasus ini Git menjalankan 3-way merge: membandingkan tiga titik — commit di branch kita (HEAD), commit di branch yang digabung, dan commit ancestor bersama (titik terakhir keduanya masih satu jalur). Hasilnya digabungkan ke dalam satu merge commit baru yang memiliki dua parent.
* f0a2b1c Merge branch 'fitur-nav'
|\
| * 7c3d9e1 feat: tambah navbar
| * 2b8a4f2 feat: tambah komponen nav
* | a1c5e7d fix: perbaiki headerMeski fast-forward memungkinkan, kadang kalian ingin selalu mencatat keberadaan sebuah branch di sejarah. git merge --no-ff <nama-branch> memaksa pembuatan merge commit meski fast-forward memungkinkan. Pola ini umum di tim yang ingin fitur terlihat sebagai unit yang jelas di riwayat.
git merge --no-ff fitur-navSebelum menyerah pada konflik, pahami dulu kapan konflik muncul. Git sangat pintar menggabungkan: jika dua branch mengubah baris yang berbeda di file yang sama, Git menggabungkannya otomatis tanpa drama. Konflik hanya muncul ketika dua branch mengubah baris yang sama (atau berdekatan) pada file yang sama, atau satu menghapus file yang diubah branch lain.
Secara sederhana: Git tidak bisa menentukan mana yang benar karena keduanya mengklaim area yang sama. Di titik inilah Git meminta keputusan manusia.
Note
Konflik bukan tanda kalian salah menggunakan Git — itu tanda dua perubahan sah yang bersinggungan. Tim profesional menyelesaikan puluhan konflik setiap minggu dengan tenang.
Saat konflik terjadi, Git menyisipkan penanda di dalam file:
<<<<<<< HEAD
Versi dari branch yang sedang aktif (main)
=======
Versi dari branch yang digabung (fitur-nav)
>>>>>>> fitur-navTiga bagian penting:
<<<<<<< HEAD — awal blok versi branch aktif kita.======= — pemisah kedua versi.>>>>>>> fitur-nav — akhir blok versi branch yang digabungkan.Mari kita kerjakan contoh nyata. Sebuah project aplikasi-kafe memiliki file app.js dengan baris penentu nama aplikasi. Branch main mengubahnya menjadi KafeKita, sementara branch fitur-rebrand mengubah baris yang sama menjadi Kafe Kopi Nusantara. Saat menggabungkan:
git switch main
git merge fitur-rebrandGit merespons dengan status konflik. Langkah penyelesaiannya:
git status — file akan berlabel "both modified".<<<<<<< HEAD
const nama = "KafeKita";
=======
const nama = "Kafe Kopi Nusantara";
>>>>>>> fitur-rebrandconst nama = "Kafe Kopi Nusantara";git add app.js, lalu selesaikan merge:git add app.js
git merge --continuegit merge --continue membuat merge commit dan membuka editor untuk pesan commit (atau git commit juga bekerja). Setelah selesai, cek dengan git log --oneline bahwa merge commit tercipta.
Tip
Di VS Code, tombol "Accept Current / Accept Incoming / Accept Both" membantu memilih versi dengan cepat. Untuk konflik rumit, gunakan diff tool visual dari editor atau git mergetool.
Selain merge, ada rebase: mengambil commit-commit branch fitur dan menerapkannya kembali di atas ujung branch utama, sehingga sejarah tampak linear seolah fitur dikerjakan berurutan setelah main.
git switch fitur-rebrand
git rebase mainPerbedaannya: merge mempertahankan percabangan asli dan mencatat merge commit; rebase menulis ulang hash commit sehingga garis sejarah lurus. Rebase juga bisa menimbulkan konflik yang sama, diselesaikan dengan git add lalu git rebase --continue.
Warning
Aturan emas: jangan pernah rebase branch publik yang dipakai bersama orang lain. Rebase menulis ulang sejarah; jika orang lain sudah menarik commit lama, hash barunya akan membuat mereka berantakan. Gunakan rebase hanya untuk branch lokal/pribadi — detail lanjutan ada di episode 16.
Poin kunci episode ini:
git merge <nama-branch> menggabungkan branch; --no-ff memaksa merge commit.<<<<<<< HEAD, =======, dan >>>>>>> nama-branch.git add, lalu git merge --continue.Fondasi lokal sudah solid. Di episode 8 kita membawa semua kode itu ke dunia nyata: bekerja dengan remote repository di GitHub — dari membuat repository, menautkannya dengan origin, hingga push pertama. Sampai jumpa!