Merge: Fast-Forward, Three-Way, Conflicts
Tujuan Pembelajaran
- Memahami perbedaan fast-forward merge dan three-way merge
- Mampu menggabungkan branch dengan git merge
- Mampu mengenali dan menyelesaikan merge conflict
Materi Inti
A. Fast-Forward Merge
Fast-forward merge terjadi ketika branch target (misalnya main) tidak memiliki commit baru sejak branch fitur dibuat. Git cukup โmemajukanโ pointer main ke depan.
SEBELUM merge:
main: C0 <- C1
fitur: C0 <- C1 <- C2 <- C3
SESUDAH git merge fitur (dari main):
main: C0 <- C1 <- C2 <- C3
(main hanya "maju" ke depan, tanpa commit merge baru)
Info: Fast-forward merge menghasilkan history yang linear dan bersih. Tidak ada merge commit tambahan.
B. Three-Way Merge
Three-way merge terjadi ketika kedua branch memiliki commit baru yang berbeda. Git membuat merge commit baru yang menggabungkan keduanya.
SEBELUM merge:
main: C0 <- C1 <- C4
fitur: C0 <- C1 <- C2 <- C3
SESUDAH git merge fitur (dari main):
main: C0 <- C1 <- C4 <- C5 (merge commit)
\ C2 <- C3 /
Tiga โwayโ yang dibandingkan:
- Base โ commit ancestor terakhir yang sama (C1)
- Ours โ commit terakhir di branch saat ini (C4)
- Theirs โ commit terakhir di branch yang di-merge (C3)
C. Merge Conflict
Conflict terjadi ketika 2 branch mengedit baris yang sama di file yang sama. Git tidak bisa memutuskan versi mana yang benar, sehingga kamu harus menyelesaikan secara manual.
Tampilan file conflict:
<<<<<<< HEAD
Kode dari branch saat ini (main)
=======
Kode dari branch yang di-merge (fitur)
>>>>>>> fitur
Cara menyelesaikan conflict:
- Buka file yang conflict di editor
- Pilih kode mana yang benar (atau gabungkan keduanya)
- Hapus semua marker:
<<<<<<<,=======,>>>>>>> - Jalankan
git add <file>untuk menandai conflict sudah selesai - Jalankan
git commituntuk menyelesaikan merge
Warning: Jangan pernah commit file yang masih mengandung marker conflict (
<<<<<<<). Pastikan semua marker sudah dihapus sebelum commit.
Membatalkan merge yang sedang conflict:
git merge --abort
Perintah ini akan mengembalikan semua file ke kondisi sebelum merge dimulai.
Demonstrasi Live
Simulasi Merge Conflict
mkdir latihan-merge && cd latihan-merge && git init
# Setup commit awal
echo "Judul: Website Keren" > README.md
git add . && git commit -m "Commit awal"
# Branch A mengedit baris 1
git switch -c fitur-a
echo "Judul: Website Super Keren" > README.md
git add . && git commit -m "Fitur A: ubah judul"
# Branch B juga mengedit baris 1
git switch main
git switch -c fitur-b
echo "Judul: Website Luar Biasa" > README.md
git add . && git commit -m "Fitur B: ubah judul"
# Merge fitur-a ke main (sukses, fast-forward)
git switch main
git merge fitur-a
# Merge fitur-b ke main (CONFLICT!)
git merge fitur-b
# Auto-merging README.md
# CONFLICT (content): Merge conflict in README.md
# Lihat file conflict
cat README.md
# <<<<<<< HEAD
# Judul: Website Super Keren
# =======
# Judul: Website Luar Biasa
# >>>>>>> fitur-b
# Selesaikan: pilih versi gabungan
echo "Judul: Website Super Luar Biasa" > README.md
git add README.md
git commit -m "Merge fitur-b: gabungkan judul"
# Lihat history
git log --oneline --graph --all
Latihan Interaktif
A. Latihan Visualisasi โ Learn Git Branching
Level: โMerging in Gitโ (Introduction Level 3)
Ketik di LGB: level intro3
Pada level ini kamu akan mempraktikkan merge secara visual. Buat branch bugFix, commit di sana, kembali ke main, commit juga di main, lalu merge.
Solusi:
git checkout -b bugFix
git commit
git checkout main
git commit
git merge bugFix
B. Latihan Terminal: Skenario Conflict
Buat 3 skenario conflict yang berbeda dan selesaikan masing-masing:
Skenario 1: Conflict di 1 file
mkdir conflict-1 && cd conflict-1 && git init
echo "warna: merah" > config.txt
git add . && git commit -m "Init config"
git switch -c tim-a
echo "warna: biru" > config.txt
git add . && git commit -m "Tim A: ubah warna ke biru"
git switch main
git switch -c tim-b
echo "warna: hijau" > config.txt
git add . && git commit -m "Tim B: ubah warna ke hijau"
git switch main
git merge tim-a
git merge tim-b
# CONFLICT! Selesaikan secara manual
Skenario 2: Conflict di banyak file
# Buat project dengan beberapa file
# Edit file yang sama di 2 branch berbeda
# Merge dan selesaikan semua conflict
Skenario 3: Latihan git merge โabort
# Buat skenario conflict
# Saat conflict muncul, jalankan:
git merge --abort
# Semua file kembali ke kondisi sebelum merge
Tugas Mandiri
- LGB: Selesaikan level
intro3(Merging in Git) - Buat 3 skenario conflict yang berbeda dan selesaikan masing-masing
- Latihan menggunakan
git merge --abortuntuk membatalkan merge yang sedang conflict
Praktik Interaktif
Selesaikan level berikut untuk memperkuat pemahaman kamu.