Merapikan histori commit dengan interactive rebase: reword untuk mengubah pesan, squash dan fixup untuk menggabungkan commit, drop untuk menghapus, serta Golden Rule of Rebase yang melarang menulis ulang branch publik yang dipakai bersama.

Di episode 15 sebelumnya kita menata working directory: menyimpan pekerjaan yang belum selesai dengan git stash dan membersihkan file tak terlacak dengan git clean. Di episode 16 ini kita naik satu level dan menata sesuatu yang jauh lebih berharga: riwayat commit itu sendiri, lewat Interactive Rebase.
Mengapa ini penting? Histori commit adalah dokumentasi yang dibaca seluruh tim. Riwayat yang berantakan — fix typo, wip, test lagi, asdf — membuat code review, debugging, dan pelacakan regresi menjadi menyakitkan. Interactive rebase memberi kalian kontrol penuh untuk mengubah riwayat sebelum kode dikirim ke remote, persis seperti mengedit draf tulisan sebelum dipublikasikan.
Kita sudah menyentuh rebase dasar di episode 7 saat membandingkan merge vs rebase. Intinya: rebase menerapkan ulang commit di atas basis baru sehingga riwayat menjadi linear. Karena commit diterapkan ulang, setiap commit menghasilkan SHA baru — riwayat yang di-rebase tidak pernah identik dengan aslinya. Mode interaktif tinggal menambahkan satu fitur: kalian bisa ikut campur di tengah prosesnya. Pastikan kalian memakai Git terbaru dengan git --version (versi stabil 2.4x di 2026).
git rebase -i HEAD~3Perintah di atas membuka editor berisi tiga commit terakhir, urut dari yang paling lama di baris paling atas hingga yang paling baru di bawah:
pick a1b2c3d feat: tambah model User
pick e4f5g6h fix: perbaiki validasi email
pick i7j8k9l chore: rapikan dokumentasiIni disebut todo list. Kalian bebas menata ulang baris-barisnya, lalu simpan — git mengeksekusi perintah satu per satu dari atas ke bawah.
| Perintah | Singkatan | Fungsi |
|---|---|---|
pick | p | Menggunakan commit apa adanya |
reword | r | Menggunakan commit dan mengganti pesannya |
squash | s | Menggabungkan commit dengan commit di baris atasnya, pesan digabung |
fixup | f | Menggabungkan commit dengan commit di baris atasnya, pesan dibuang |
drop | d | Menghapus commit dari riwayat |
edit | e | Berhenti di commit tersebut untuk mengubah isinya |
Ubah pick menjadi reword (atau r) pada baris commit yang pesannya ingin diganti. Setelah todo disimpan, editor baru terbuka untuk mengetik pesan final. Hasilnya: isi commit tetap, SHA dan pesannya berubah.
Tiga commit kecil yang seharusnya satu bisa disatukan:
pick a1b2c3d feat: tambah model User
squash e4f5g6h fix: perbaiki validasi email
squash i7j8k9l chore: rapikan dokumentasiSetelah todo disimpan, git membuka editor kedua untuk menyusun pesan gabungan. Simpan, dan tiga commit menjadi satu:
git log --onelineUrutan di todo list sangat menentukan: squash selalu menempel ke commit di baris atasnya (yang lebih lama). Jadi atur baris sesuai urutan waktu, bukan urutan acak.
fixup identik dengan squash, tapi pesan commit yang di-fixup dibuang tanpa menampilkan editor penggabungan pesan:
pick a1b2c3d feat: tambah model User
fixup e4f5g6h typo kecilHasil akhirnya satu commit feat: tambah model User yang bersih — cocok untuk pembetulan kecil yang tidak layak jadi commit sendiri.
Ubah menjadi drop (atau d) untuk menghapus commit dari riwayat. Ini pilihan yang lebih bersih daripada membiarkan commit yang salah tetap berada di branch bersama.
Jika di tengah sesi kalian sadar ada yang salah, atau ingin mundur:
git rebase --abortSesi dibatalkan dan riwayat kembali persis seperti sebelum rebase dimulai.
Ada satu aturan yang tidak bisa ditawar:
Jangan pernah melakukan rebase pada branch yang sudah dipublikasikan dan digunakan bersama orang lain.
Rebase menulis ulang SHA commit. Jika main di remote sudah dipakai banyak orang, menulis ulang riwayatnya membuat repositori semua orang tidak sinkron — seperti mengubah alamat rumah yang sudah tercetak di ribuan kartu nama.
Warning
Rebase hanya boleh menyentuh riwayat lokal atau privat: branch fitur milik sendiri atau commit yang belum pernah di-push. Untuk memperbaiki commit yang sudah di-push, gunakan git revert dari episode 14 — ia membuat commit pembatalan baru dan jejak audit tetap utuh.
Branch fitur yang sudah di-push lalu di-rebase akan ditolak oleh remote karena riwayatnya berbeda. Solusinya force push yang aman:
git push --force-with-lease origin nama-branch--force-with-lease memeriksa kondisi remote sebelum menimpa: jika orang lain sudah menambahkan commit di branch itu, push ditolak. Jauh lebih aman daripada git push --force yang telanjang.
Caution
Jangan pernah memakai git push --force tanpa --force-with-lease di branch bersama. Menimpa riwayat remote dapat menghancurkan commit rekan kerja dan sangat sulit dipulihkan. Disiplin ini bagian dari Golden Rule of Rebase.
Poin yang harus kalian bawa:
git rebase -i HEAD~N membuka todo list untuk merapikan N commit terakhir.reword mengubah pesan, squash menggabungkan commit beserta pesannya, fixup menggabungkan tanpa pesan, dan drop menghapus commit.squash dan fixup menempel ke commit di baris atasnya.--force-with-lease, dan hanya untuk riwayat milik sendiri.Setelah bisa menata ulang riwayat, kalian butuh alat untuk menjelajahinya secara cerdas. Di episode 17 berikutnya kita membahas Advanced History Navigation: mengambil commit spesifik dari branch lain dengan git cherry-pick, memulihkan commit yang terhapus lewat git reflog, dan mencari commit penyebab bug dengan git bisect. Sampai jumpa di episode 17!