Pertemuan Pertemuan 13

Merge: Fast-Forward, Three-Way, Conflicts

Pertemuan 13 / 32
Intermediate Modul 2.1 60 menit
Pertemuan 13

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:

  1. Base โ€” commit ancestor terakhir yang sama (C1)
  2. Ours โ€” commit terakhir di branch saat ini (C4)
  3. 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:

  1. Buka file yang conflict di editor
  2. Pilih kode mana yang benar (atau gabungkan keduanya)
  3. Hapus semua marker: <<<<<<<, =======, >>>>>>>
  4. Jalankan git add <file> untuk menandai conflict sudah selesai
  5. Jalankan git commit untuk 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

  1. LGB: Selesaikan level intro3 (Merging in Git)
  2. Buat 3 skenario conflict yang berbeda dan selesaikan masing-masing
  3. Latihan menggunakan git merge --abort untuk membatalkan merge yang sedang conflict

Praktik Interaktif

Selesaikan level berikut untuk memperkuat pemahaman kamu.

Learn Git Branching โ€” Level: intro3
Buka di tab baru
Memuat Learn Git Branching...