Merge menggabungkan perubahan dari satu branch ke branch lain.
Alur merge:
- Pindah ke branch tujuan (biasanya
main) - Jalankan
git merge <branch-sumber>
$ git checkout main
$ git merge fitur-navbar
Jenis merge:
- Fast-forward — jika main tidak berubah sejak branch dibuat, cukup geser pointer:
main ──●──●
\
fitur-navbar ●──● → main dipindahkan ke sini
- Merge commit — jika keduanya berubah, Git membuat commit khusus:
main ──●──●──●──M (merge commit)
\ /
fitur-navbar ●──●
Mekanisme 3-Way Merge
Saat merge commit dibuat, Git membandingkan tiga versi sekaligus:
- BASE — commit nenek moyang bersama (common ancestor) dari kedua branch
- OURS — ujung branch tujuan (tempat kamu
git merge) - THEIRS — ujung branch sumber (yang digabungkan)
Git mencari leluhur bersama otomatis dengan algoritma merge-base. Untuk tiap file:
- Jika hanya satu sisi berubah dari BASE → ambil yang berubah
- Jika kedua sisi berubah di baris berbeda → gabungkan otomatis
- Jika kedua sisi mengubah baris yang sama → conflict
Fast-forward vs merge commit:
| Perintah | Kapan | Efek |
|---|---|---|
git merge fitur |
default | fast-forward jika bisa, else merge commit |
git merge --ff-only fitur |
CI/production | tolak jika perlu merge commit |
git merge --no-ff fitur |
ingin jejak branch | selalu buat merge commit |
git merge --squash fitur |
rapikan | ringkas jadi 1 commit (tanpa merge commit) |
--no-ffberguna untuk menjaga "siapa merge branch apa" di history.--squashcocok untuk GitHub PR yang ingin history linear.