Belajar Git - Penggabungan Kode (Merge vs Rebase Dasar)
Episode 7 of 21

Belajar Git - Penggabungan Kode (Merge vs Rebase Dasar)

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.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

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.

Mekanisme Merge

Fast-Forward Merge

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.

Fast-forward merge
git switch main
git merge fitur-nav

Outputnya menyebut "Fast-forward", dan sejarah tetap linear seperti kereta yang melaju di rel yang sama. Tidak ada commit baru, hanya pointer yang berpindah.

Non-Fast-Forward Merge (3-Way Merge Commit)

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.

Sejarah bercabang setelah merge
*   f0a2b1c Merge branch 'fitur-nav'
|\
| * 7c3d9e1 feat: tambah navbar
| * 2b8a4f2 feat: tambah komponen nav
* | a1c5e7d fix: perbaiki header

Memaksa Merge Commit dengan --no-ff

Meski 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.

Memaksa merge commit
git merge --no-ff fitur-nav

Merge Conflict: Kenapa Terjadi?

Sebelum 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.

Anatomi Tanda Konflik

Saat konflik terjadi, Git menyisipkan penanda di dalam file:

Anatomi merge conflict
<<<<<<< HEAD
Versi dari branch yang sedang aktif (main)
=======
Versi dari branch yang digabung (fitur-nav)
>>>>>>> fitur-nav

Tiga bagian penting:

  • <<<<<<< HEAD — awal blok versi branch aktif kita.
  • ======= — pemisah kedua versi.
  • >>>>>>> fitur-nav — akhir blok versi branch yang digabungkan.

Menyelesaikan Konflik Langkah demi Langkah

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:

Mencoba menggabungkan branch
git switch main
git merge fitur-rebrand

Git merespons dengan status konflik. Langkah penyelesaiannya:

  1. Identifikasi file bermasalah dengan git status — file akan berlabel "both modified".
  2. Buka file di editor. Di dalamnya terdapat blok konflik:
File app.js dalam kondisi konflik
<<<<<<< HEAD
const nama = "KafeKita";
=======
const nama = "Kafe Kopi Nusantara";
>>>>>>> fitur-rebrand
  1. Pilih hasil akhir. Untuk rebranding, kita pilih nama baru, lalu hapus seluruh penanda konflik sehingga tersisa satu baris yang diinginkan:
File app.js setelah resolusi
const nama = "Kafe Kopi Nusantara";
  1. Tandai sebagai selesai dengan git add app.js, lalu selesaikan merge:
Menyelesaikan merge setelah konflik
git add app.js
git merge --continue

git 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.

Rebase Dasar: Alternatif Sejarah Linear

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.

Rebase branch fitur di atas main
git switch fitur-rebrand
git rebase main

Perbedaannya: 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.

Penutup

Poin kunci episode ini:

  • Fast-forward merge menggeser pointer tanpa commit baru; 3-way merge menghasilkan merge commit dengan dua parent.
  • git merge <nama-branch> menggabungkan branch; --no-ff memaksa merge commit.
  • Konflik muncul saat dua branch mengubah baris yang sama; perubahan di area berbeda digabung otomatis.
  • Anatomi penanda: <<<<<<< HEAD, =======, dan >>>>>>> nama-branch.
  • Resolusi konflik: pilih isi, hapus penanda, git add, lalu git merge --continue.
  • Rebase menerapkan ulang commit untuk sejarah linear; jangan dipakai di branch publik.

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!

Belajar Git - Penggabungan Kode (Merge vs Rebase Dasar) | Belajar Git & GitHub