Git rebase adalah salah satu perintah yang paling sering disalahpahami sekaligus paling powerful di Git. Rebase menawarkan cara alternatif untuk mengintegrasikan perubahan dari satu branch ke branch lain, menghasilkan histori yang lebih linear dan bersih dibanding merge. Tapi rebase juga punya aturan yang wajib dipatuhi agar tidak menyebabkan masalah di tim.
Apa itu Rebase?
Secara sederhana, rebase memindahkan atau “memutar ulang” commit dari satu branch ke atas branch lain.
Merge vs Rebase
Kondisi Awal:
main: A ── B ── E ── F
\
feature: C ── D
Setelah git merge main (di branch feature):
main: A ── B ── E ── F
\ \
feature: C ── D ── M (merge commit)
Setelah git rebase main (di branch feature):
main: A ── B ── E ── F
\
feature: C' ── D' (commit baru, hash berubah!)
Dengan rebase, commit C dan D “dipindahkan” ke atas F (ujung main). Hasilnya adalah histori yang linear — seolah-olah feature branch dimulai dari ujung main, bukan dari titik percabangan awal.
Perhatikan tanda ' (prime) — hash commit berubah karena commit dibuat ulang di posisi baru.
Cara Menggunakan Rebase
# Di branch feature, rebase ke atas main
git switch feature/login
git rebase main
# Alternatif (dari luar branch feature)
git rebase main feature/login
Setelah Rebase Berhasil
# Merge ke main sudah bisa fast-forward (histori linear)
git switch main
git merge feature/login # Fast-forward
git branch -d feature/login
Rebase Conflict
Rebase bisa mengalami conflict, mirip merge conflict. Perbedaannya: conflict bisa terjadi di setiap commit yang di-rebase, bukan hanya di akhir.
git rebase main
# CONFLICT (content): Merge conflict in src/auth.js
# error: could not apply a1b2c3d... feat: tambah login
Menyelesaikan Rebase Conflict
# 1. Edit file yang konflik
nano src/auth.js
# 2. Stage file yang sudah diselesaikan
git add src/auth.js
# 3. Lanjutkan rebase (jangan git commit!)
git rebase --continue
# Jika ada commit lain yang konflik, ulangi langkah 1-3
# Membatalkan rebase dan kembali ke kondisi semula
git rebase --abort
Interactive Rebase — Mengedit Histori Lokal
git rebase -i (interactive) adalah fitur paling powerful dari rebase. Ini memungkinkan kamu mengedit, menggabungkan, menghapus, dan mengubah urutan commit sebelum di-push.
# Rebase interaktif 3 commit terakhir
git rebase -i HEAD~3
Git akan membuka editor dengan daftar commit:
pick a1b2c3d feat: tambah halaman login
pick b2c3d4e fix: perbaiki typo di login
pick c3d4e5f wip: sedang kerjakan logout
# Commands:
# p, pick = gunakan commit ini apa adanya
# r, reword = gunakan commit, tapi ubah pesannya
# e, edit = gunakan commit, tapi berhenti untuk amend
# s, squash = gabungkan dengan commit sebelumnya
# f, fixup = gabungkan, buang pesan commit ini
# d, drop = hapus commit ini
Contoh: Squash — Gabungkan Beberapa Commit
Ubah pick menjadi squash (atau s) untuk commit yang ingin digabungkan ke commit sebelumnya:
pick a1b2c3d feat: tambah halaman login
squash b2c3d4e fix: perbaiki typo di login
squash c3d4e5f wip: sedang kerjakan logout
Git akan membuka editor lagi untuk menulis pesan commit gabungan:
feat: tambah halaman login
- tambah form login dengan validasi
- perbaiki typo di label
- tambah fungsi logout
Contoh: Reword — Ubah Pesan Commit
pick a1b2c3d feat: tambah halaman login
reword b2c3d4e fix typo ← akan diminta tulis ulang pesan ini
pick c3d4e5f feat: tambah logout
Contoh: Drop — Hapus Commit
pick a1b2c3d feat: tambah halaman login
drop b2c3d4e commit debug yang tidak perlu
pick c3d4e5f feat: tambah logout
Aturan Emas Rebase
Jangan rebase commit yang sudah di-push ke remote repository yang di-share dengan orang lain.
Mengapa? Karena rebase mengubah hash commit (membuat commit baru). Jika orang lain sudah mempunyai commit lama di lokal mereka, histori mereka akan bertentangan dengan histori yang baru.
Kapan Rebase Aman?
✅ Rebase branch lokal yang belum di-push sama sekali
✅ Rebase branch pribadi yang hanya kamu yang pakai (force push ke origin diperbolehkan)
✅ Interactive rebase untuk merapikan commit sebelum membuat Pull Request
Kapan Harus Pakai Merge?
✅ Ketika branch sudah di-push dan di-share dengan tim
✅ Untuk mengintegrasikan branch ke main (buat merge commit yang jelas)
✅ Ketika kamu ingin mempertahankan konteks “kapan branch ini dibuat”
git pull --rebase
# Daripada merge saat pull (default)
git pull
# Gunakan rebase saat pull untuk histori lebih bersih
git pull --rebase
# Set sebagai default
git config --global pull.rebase true
Dengan --rebase, commit lokal kamu yang belum di-push akan diletakkan di atas commit terbaru dari remote — menghasilkan histori yang lebih linear.
Merge vs Rebase: Mana yang Harus Dipilih?
| Pertimbangan | Merge | Rebase |
|---|---|---|
| Histori | Non-linear, ada merge commit | Linear, bersih |
| Keamanan | Aman selalu | Berbahaya jika salah |
| Cocok untuk | Branch yang di-share | Branch lokal/pribadi |
| Keterbacaan log | Bisa ramai | Mudah dibaca |
| Konteks | Jelas kapan branch dibuat | Seolah-olah linear |
Banyak tim menggunakan pendekatan gabungan: rebase untuk merapikan branch lokal, merge (dengan --no-ff) untuk mengintegrasikan ke main.
Kesimpulan
Rebase adalah alat yang powerful untuk menghasilkan histori Git yang bersih dan mudah dibaca. Kuncinya adalah memahami kapan aman digunakan dan kapan harus dihindari. Dengan git rebase -i, kamu bisa merapikan puluhan commit berantakan menjadi histori yang rapi sebelum berbagi ke tim.
Di artikel berikutnya, kita bahas git stash — cara menyimpan pekerjaan yang sedang berjalan sementara untuk berpindah branch.
Kiki/🎮🍉⌨️🍩💻