Merge menggabungkan pekerjaan dari satu branch ke branch lain, biasanya dari branch fitur ke main. Bayangin kamu menulis bab baru di draf terpisah, sementara naskah utama ada di meja editor. Kalau naskah utama belum disentuh sejak kamu mulai, editor tinggal memakai draf-mu sebagai naskah terbaru. Kalau naskah utama juga sudah diubah orang lain, editor harus menyatukan keduanya jadi versi baru. Git melakukan dua hal itu persis.
🧪 Tebakan cepat: di latihan,
maingak dapat commit baru sejakfitur-footerdibuat. Waktu kamu menjalankangit merge fitur-footer, Git bikin commit baru atau gak? Tebak dulu, jawabannya ada di bagian "Fast-forward: main tinggal digeser".
Pindah ke branch tujuan, lalu merge
Merge selalu memasukkan branch yang kamu sebut ke branch tempat kamu berada. Jadi pindah dulu ke branch tujuan, yang mau menerima perubahan, baru sebut branch sumbernya.
git switch main # 1. pindah ke branch tujuan (atau: git checkout main)
git merge fitur-footer # 2. masukkan fitur-footer ke main
git switch main: yang akan berubah adalahmain, jadi kamu harus berdiri di sana.git merge fitur-footer: commit difitur-footeryang belum ada dimainikut masuk kemain.fitur-footersendiri gak berubah.- Kalau terbalik (
git switch fitur-footerlalugit merge main), yang berubah justrufitur-footer:mainyang dimasukkan ke fitur.
Contoh dari awal sampai merge
Repo-nya punya index.html dan footer.html yang berisi <footer>Copyright 2024</footer>:
git init
git add .
git commit -m "initial"
git switch -c fitur-footer # atau: git checkout -b fitur-footer
echo "<footer>Copyright 2025</footer>" > footer.html # ubah isi footer
git add .
git commit -m "tambah footer"
git switch main # balik ke branch tujuan
git merge fitur-footer
echo "teks" > footer.htmlmenulis ulang isi file dari terminal. Commit butuh perubahan: tanpa itu, Git menolak dengannothing to commit, working tree clean.- Commit "tambah footer" lahir di
fitur-footer.mainmasih di commit "initial". git switch mainlalugit merge fitur-footermemasukkan commit itu kemain.
Output merge-nya (hash-mu pasti beda):
$ git merge fitur-footer
Updating 3f2a1c9..8b7d4e0
Fast-forward
footer.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Fast-forward: main tinggal digeser
main di |
fitur-footer di |
|
|---|---|---|
| Sebelum merge | initial | tambah footer |
| Sesudah merge | tambah footer | tambah footer |
main gak berubah sejak fitur-footer dibuat, jadi commit "tambah footer" sudah nyambung langsung di depan main. Git cukup menggeser main maju ke commit itu. Ini disebut fast-forward, dan gak ada commit baru yang dibuat. Itu jawaban tebakannya. Sekarang main punya 2 commit: "initial" dan "tambah footer", dan itulah yang dicek latihannya.
Merge commit: kalau dua-duanya sudah maju
Misalnya sebelum merge, main juga dapat commit baru: seseorang menambah about.html lewat commit "tambah halaman about". Sekarang dua jalur sudah bercabang, dan main gak bisa sekadar digeser. Git membuat merge commit: commit baru dengan dua parent, yaitu ujung main dan ujung fitur-footer.
$ git merge fitur-footer
Merge made by the 'ort' strategy.
footer.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Sebelum baris itu muncul, Git membuka editor berisi pesan bawaan Merge branch 'fitur-footer'. Simpan dan tutup saja, atau pakai git merge --no-edit fitur-footer supaya langsung jalan.
Isinya ditentukan dengan 3-way merge. Git membandingkan tiga versi: base (commit tempat dua branch mulai berpisah), ujung branch tempat kamu berada, dan ujung branch yang di-merge. Untuk tiap baris:
- Cuma satu sisi yang mengubah baris itu dari base? Perubahan itu yang dipakai.
- Dua sisi mengubah baris yang berbeda? Dua-duanya dipakai.
- Dua sisi mengubah baris yang sama dengan isi berbeda? Itu conflict, dan kamu yang memutuskan. Caranya ada di pelajaran Merge Conflicts.
Di contoh ini about.html cuma berubah di main dan footer.html cuma berubah di fitur-footer, jadi hasil merge-nya memuat keduanya.
💡 Mau jejak fiturnya kelihatan? Pakai --no-ff
git merge --no-ff fitur-footer selalu membuat merge commit, walau fast-forward sebenarnya bisa. Di history jadi kelihatan "fitur ini masuk di sini" sebagai satu kelompok commit. Banyak tim memakai cara ini untuk fitur yang besar.
⚠️ Jebakan yang sering ketemu
- Merge dari branch yang salah.
git switch fitur-footerlalugit merge mainmemasukkanmainke fitur, kebalikan dari yang kamu mau. Cekgit branchdulu: tanda*harus ada di branch tujuan. - Lupa commit di branch fitur. Kalau
fitur-footergak punya commit baru,git merge fitur-footercuma bilangAlready up to date.danmaintetap 1 commit. - Lupa balik ke
main. Latihan ini mengecek kamu berakhir dimain, karena di sanalah merge-nya dijalankan. - Bingung di editor. Kalau terminal membuka Vim waktu membuat merge commit, ketik
:wqlalu Enter untuk menyimpan pesan bawaan dan keluar.
TL;DR: Pindah ke branch tujuan dulu (git switch main atau git checkout main), lalu git merge nama-branch: branch yang disebut masuk ke branch tempat kamu berada. Kalau tujuan belum berubah sejak branch fitur dibuat, terjadi fast-forward: pointer main cuma digeser maju, tanpa commit baru. Kalau dua-duanya sudah maju, Git membuat merge commit dengan dua parent lewat 3-way merge (base, branch-mu, branch yang di-merge). Dua sisi mengubah baris yang sama berarti conflict. --no-ff memaksa merge commit supaya jejak fiturnya kelihatan.