Pertemuan Pertemuan 23

Rebase vs Merge

Pertemuan 23 / 32
Advanced Modul 3.1 60 menit
Pertemuan 23

Rebase vs Merge

Tujuan Pembelajaran

  • Memahami perbedaan rebase dan merge secara mendalam
  • Menguasai Golden Rule of Rebasing
  • Mampu memilih strategi yang tepat sesuai konteks

Selamat Datang di Level 3: Advanced

Kamu sudah menguasai dasar-dasar Git dan kolaborasi dengan GitHub. Di Level 3, kamu akan mempelajari teknik-teknik advanced yang digunakan oleh professional developer sehari-hari.

Level ini mencakup: rebase, interactive rebase, reflog, reset, revert, cherry-pick, bisect, hooks, dan submodules.


Materi Inti

A. Rebase vs Merge --- Perbandingan Visual

Kedua perintah ini sama-sama menggabungkan perubahan dari satu branch ke branch lain, tapi dengan cara yang sangat berbeda.

Merge:

main:   A --- B --- C ----------- M (merge commit)
                  \             /
fitur:             D --- E ----
  • Membuat merge commit baru (M) yang menggabungkan kedua branch
  • History tetap menunjukkan percabangan asli
  • Tidak mengubah commit yang sudah ada
  • Aman untuk branch yang sudah di-share

Rebase:

Sebelum rebase:
main:   A --- B --- C
                  \
fitur:             D --- E

Sesudah rebase (dari branch fitur: git rebase main):
main:   A --- B --- C
                      \
fitur:                 D' --- E' (commit baru, hash berbeda!)
  • Memindahkan commit ke ujung branch target
  • Menghasilkan history yang linear (tidak bercabang)
  • Membuat commit BARU dengan hash berbeda (D menjadi D’, E menjadi E’)
  • Berbahaya jika branch sudah di-push dan digunakan orang lain

B. Perbandingan Detail

AspekMergeRebase
HistoryMenunjukkan percabangan asliLinear, bersih
Commit baru1 merge commitCommit di-recreate dengan hash baru
KeamananAman, tidak mengubah historyBisa berbahaya jika salah pakai
Cocok untukBranch shared, main branchBranch lokal, sebelum PR
KonflikDiselesaikan sekali di merge commitMungkin perlu diselesaikan per-commit

C. Golden Rule of Rebasing

JANGAN pernah rebase branch yang sudah di-push dan digunakan oleh orang lain.

Mengapa? Karena rebase mengubah hash commit. Jika orang lain sudah base work mereka pada commit asli, rebase akan menyebabkan konflik dan kebingungan.

Boleh rebase:

  • Branch fitur lokal yang belum di-push
  • Branch fitur pribadi sebelum membuat PR
  • Untuk membersihkan history sebelum merge

Jangan rebase:

  • Branch main atau develop
  • Branch yang sudah di-push dan ada orang lain yang bekerja di atasnya
  • Commit yang sudah di-merge

D. Perintah Rebase

# Rebase branch saat ini ke main
git rebase main

# Jika ada konflik selama rebase
git status                  # Lihat file yang konflik
# ... selesaikan konflik ...
git add <file>
git rebase --continue       # Lanjutkan rebase

# Batalkan rebase (kembali ke sebelum rebase)
git rebase --abort

# Setelah rebase, push memerlukan --force (HATI-HATI!)
git push --force-with-lease origin fitur-branch

Tips: Selalu gunakan --force-with-lease daripada --force. Perintah ini lebih aman karena akan gagal jika remote sudah berubah sejak fetch terakhir kamu.

E. Cherry-Pick --- Mengambil Commit Tertentu

Cherry-pick memungkinkan kamu mengambil commit spesifik dari branch lain tanpa merge seluruh branch.

# Ambil satu commit
git cherry-pick abc123

# Ambil beberapa commit
git cherry-pick abc123 def456 ghi789

Kapan menggunakan cherry-pick:

  • Perlu hotfix yang sudah ada di branch lain
  • Ingin mengambil fitur tertentu tanpa seluruh branch
  • Memperbaiki kesalahan commit di branch yang salah

Demonstrasi Live

Visualisasi Rebase vs Merge

# Setup project
mkdir latihan-rebase && cd latihan-rebase && git init

# Commit di main
echo "v1" > file.txt && git add . && git commit -m "A: versi 1"
echo "v2" > file.txt && git add . && git commit -m "B: versi 2"

# Buat branch fitur
git switch -c fitur
echo "fitur-1" > fitur.txt && git add . && git commit -m "D: fitur 1"
echo "fitur-2" >> fitur.txt && git add . && git commit -m "E: fitur 2"

# Simulasi: main terus bergerak
git switch main
echo "v3" > file.txt && git add . && git commit -m "C: versi 3"

# Lihat graph sebelum
git log --oneline --graph --all

# === OPSI 1: MERGE ===
git switch main
git merge fitur
git log --oneline --graph --all
# Terlihat merge commit dan percabangan

# === Reset untuk coba rebase ===
git reset --hard HEAD~1

# === OPSI 2: REBASE ===
git switch fitur
git rebase main
git log --oneline --graph --all
# History linear!

# Fast-forward merge setelah rebase
git switch main
git merge fitur
git log --oneline --graph --all
# Tidak ada merge commit, semua linear

Latihan Interaktif

Latihan LGB: Rebase Levels

Level 1: “Rebasing over 9000 times” (Advanced - Level 1)

Buka Learn Git Branching dan ketik:

level advanced1

Tujuan: Chain rebase dari satu branch ke branch lainnya.

Solusi:

git rebase main bugFix
git rebase bugFix side
git rebase side another
git rebase another main

Info: Perhatikan bagaimana setiap rebase memindahkan commit ke ujung branch target, membentuk rantai linear.

Level 2: “Cherry-pick Intro” (Moving Work Around - Level 1)

Ketik di LGB:

level move1

Tujuan: Gunakan cherry-pick untuk mengambil commit tertentu.

Solusi:

git cherry-pick C3 C4 C7

Info: Cherry-pick membuat salinan commit di branch saat ini. Commit asli tetap ada di branch asalnya.


Tugas Mandiri

  1. Buat project dengan 2 branch yang diverge (main dan fitur keduanya punya commit baru)
  2. Coba merge dan lihat hasilnya dengan git log --graph
  3. Reset, lalu coba rebase dan bandingkan hasilnya
  4. Praktikkan git cherry-pick untuk mengambil 1 commit spesifik
  5. Selesaikan kedua level LGB di atas sampai mendapat centang hijau

Praktik Interaktif

Selesaikan level berikut untuk memperkuat pemahaman kamu.

Learn Git Branching — Level: advanced1
Buka di tab baru
Memuat Learn Git Branching...
Learn Git Branching — Level: move1
Buka di tab baru
Memuat Learn Git Branching...