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
| Aspek | Merge | Rebase |
|---|---|---|
| History | Menunjukkan percabangan asli | Linear, bersih |
| Commit baru | 1 merge commit | Commit di-recreate dengan hash baru |
| Keamanan | Aman, tidak mengubah history | Bisa berbahaya jika salah pakai |
| Cocok untuk | Branch shared, main branch | Branch lokal, sebelum PR |
| Konflik | Diselesaikan sekali di merge commit | Mungkin 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
mainataudevelop - 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-leasedaripada--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
- Buat project dengan 2 branch yang diverge (main dan fitur keduanya punya commit baru)
- Coba merge dan lihat hasilnya dengan
git log --graph - Reset, lalu coba rebase dan bandingkan hasilnya
- Praktikkan
git cherry-pickuntuk mengambil 1 commit spesifik - Selesaikan kedua level LGB di atas sampai mendapat centang hijau
Praktik Interaktif
Selesaikan level berikut untuk memperkuat pemahaman kamu.