Menguasai Git Rebase Interaktif: Jurus Rahasia Sejarah Git yang Bersih dan Rapi
1. Pendahuluan
Pernahkah Anda melihat riwayat Git yang berantakan? Puluhan commit kecil seperti “fix typo”, “oops”, “lagi”, atau bahkan commit besar yang berisi berbagai perubahan tidak terkait? Riwayat Git seperti ini ibarat buku harian yang ditulis tanpa diedit: penuh coretan, salah ketik, dan sulit dipahami alur ceritanya. Bagi developer, riwayat Git yang bersih itu krusial. Bukan hanya soal estetika, tapi juga tentang:
- Kemudahan Code Review: Reviewer bisa fokus pada perubahan logis, bukan menyaring commit-commit yang tidak penting.
- Debugging yang Efisien: Dengan commit yang jelas, Anda bisa lebih mudah menggunakan
git bisectuntuk menemukan asal bug. - Kolaborasi Tim yang Lebih Baik: Rekan tim bisa memahami kontribusi Anda dengan cepat dan mudah.
- Manajemen Rilis: Riwayat yang rapi mempermudah proses pembuatan changelog dan identifikasi fitur baru.
Di sinilah git rebase -i (interaktif) datang sebagai pahlawan super. Ia adalah alat yang sangat ampuh untuk membersihkan, menyusun ulang, dan mengoptimalkan riwayat commit lokal Anda sebelum Anda membagikannya ke tim. Jika Anda sudah familiar dengan dasar-dasar Git seperti commit, push, pull, dan merge, maka ini adalah langkah selanjutnya untuk menjadi master sejarah Git!
2. Apa Itu Git Rebase Interaktif (git rebase -i)?
Secara sederhana, git rebase adalah perintah Git yang memungkinkan Anda memindahkan atau menyusun ulang urutan commit di atas base commit yang berbeda. Bayangkan Anda sedang menulis sebuah cerita. Setiap commit adalah satu bab. git rebase memungkinkan Anda mengubah urutan bab, mengedit isi bab, atau bahkan menggabungkan beberapa bab menjadi satu yang lebih padat.
Ketika kita menambahkan opsi -i (interaktif), Git memberikan Anda kontrol penuh atas setiap “bab” dalam rentang commit yang Anda pilih. Analogi yang bagus adalah seperti menyusun ulang buku harian pribadi Anda sebelum Anda memutuskan untuk menerbitkannya atau membagikannya kepada orang lain. Anda bisa:
- Mengedit entri yang salah.
- Menggabungkan beberapa entri kecil menjadi satu topik besar.
- Menghapus entri yang tidak relevan.
- Mengubah urutan entri agar alurnya lebih logis.
📌 Kunci utamanya: git rebase -i bekerja pada riwayat lokal Anda. Ini sangat penting karena rebase menulis ulang sejarah. Kita akan bahas lebih lanjut peringatan penting ini nanti.
3. Perintah Dasar dan Aksi Rebase Interaktif
Untuk memulai rebase interaktif, Anda perlu menentukan berapa banyak commit terakhir yang ingin Anda manipulasi. Sintaks yang paling umum adalah:
git rebase -i HEAD~N
Di mana N adalah jumlah commit terakhir dari HEAD yang ingin Anda sertakan dalam proses rebase. Misalnya, git rebase -i HEAD~3 akan membuka editor teks dengan tiga commit terakhir Anda.
Setelah Anda menjalankan perintah ini, Git akan membuka editor teks default Anda (biasanya Vim, Nano, atau VS Code) yang akan menampilkan daftar commit yang dipilih, dari yang paling tua di atas hingga yang paling baru di bawah, disertai dengan instruksi dan daftar aksi yang bisa Anda lakukan.
pick a1b2c3d Commit A: add user model
pick e4f5g6h Commit B: implement user registration
pick i7j8k9l Commit C: fix typo in user registration
# Rebase a1b2c3d..i7j8k9l onto a1b2c3d (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) for each commit
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's message (or the oneline, if no original merge commit was specified).
# . Use -c <commit> to re-use the given commit's message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
Mari kita fokus pada aksi-aksi utama yang paling sering digunakan:
pick(p): Ini adalah aksi default. Commit akan digunakan apa adanya.reword(r): Gunakan commit, tapi Anda akan diminta untuk mengedit pesan commit.edit(e): Gunakan commit, tapi Git akan berhenti setelah menerapkan commit ini. Anda bisa mengubah file, menambahkan commit baru (git commit --amend), atau bahkan memecah commit ini menjadi beberapa commit. Setelah selesai, jalankangit rebase --continue.squash(s): Gabungkan commit ini ke commit sebelumnya. Anda akan diminta untuk menggabungkan pesan commit dari kedua commit.fixup(f): Sama sepertisquash, tapi pesan commit dari commit saat ini akan dibuang. Hanya pesan commit dari commit sebelumnya yang akan dipertahankan. Ini cocok untuk commit “fix typo” yang tidak perlu pesan terpisah.drop(d): Hapus commit ini sepenuhnya dari riwayat.- Mengubah urutan: Anda bisa memindahkan baris commit di editor untuk mengubah urutan commit.
Setelah Anda selesai mengedit file di editor, simpan dan tutup file tersebut. Git akan mulai menerapkan perubahan rebase Anda.
4. Skenario Praktis: Membersihkan Riwayat Lokal Anda
Mari kita lihat beberapa skenario umum di mana git rebase -i sangat berguna.
4.1. 📝 Menggabungkan Beberapa Commit Menjadi Satu (Squash/Fixup)
Ini adalah salah satu penggunaan paling umum. Anda mungkin memiliki serangkaian commit seperti:
feat: add user profile pagefix: profile image not showingchore: remove console.logfeat: add user bio fieldfix: bio field validation
Commit 2, 3, dan 5 sebenarnya adalah bagian dari implementasi fitur profil pengguna, atau perbaikan kecil yang tidak perlu dicatat sebagai commit terpisah di riwayat publik.
Langkah-langkah:
-
Jalankan
git rebase -i HEAD~N, di manaNadalah jumlah commit yang ingin Anda rebase (misal:git rebase -i HEAD~5). -
Di editor, ubah aksi commit 2, 3, dan 5 menjadi
squashataufixupdi bawah commitfeat: add user profile pageataufeat: add user bio field.pick a1b2c3d feat: add user profile page fixup e4f5g6h fix: profile image not showing fixup i7j8k9l chore: remove console.log pick m0n1o2p feat: add user bio field squash q3r4s5t fix: bio field validation -
Simpan dan tutup editor. Jika Anda menggunakan
squash, editor akan muncul lagi untuk menggabungkan pesan commit. Jikafixup, pesan akan langsung dibuang. -
Hasilnya: Anda akan memiliki riwayat yang lebih ringkas, misalnya:
feat: add user profile page (with fixes and cleanup)feat: add user bio field (with validation)
✅ Tips: Gunakan fixup jika pesan commit tidak penting sama sekali (misal: “fix typo”, “debug”), dan squash jika Anda ingin menggabungkan pesan dari beberapa commit menjadi satu pesan yang lebih komprehensif.
4.2. ✒️ Mengedit Pesan Commit yang Salah (Reword)
Kadang kita membuat pesan commit yang kurang deskriptif, salah ketik, atau bahkan tidak relevan.
Langkah-langkah:
-
Jalankan
git rebase -i HEAD~N(misal:git rebase -i HEAD~2jika commit yang salah adalah commit kedua dari belakang). -
Ubah
pickmenjadirewordpada baris commit yang ingin Anda ubah.pick a1b2c3d feat: initial login reword e4f5g6h feat: add user registrasion -
Simpan dan tutup editor. Git akan membuka editor lagi untuk Anda menulis pesan commit baru.
-
Tulis pesan commit yang lebih baik, simpan, dan tutup.
4.3. ✂️ Memisahkan Commit Besar Menjadi Beberapa (Edit)
Pernah membuat commit yang terlalu besar, misalnya “Implementasi Fitur X” yang ternyata berisi:
- Perubahan skema database.
- Logika backend.
- Komponen UI frontend.
- Perbaikan bug di modul lain yang tidak sengaja terbawa.
Ini sulit di-review dan di-rollback. Kita bisa memecahnya.
Langkah-langkah:
-
Jalankan
git rebase -i HEAD~Npada commit yang terlalu besar. -
Ubah
pickmenjadieditpada commit tersebut.pick a1b2c3d feat: small feature edit e4f5g6h feat: huge commit with everything pick i7j8k9l feat: another small feature -
Simpan dan tutup editor. Git akan berhenti setelah menerapkan commit
e4f5g6h. -
Saat Git berhenti, commit tersebut sudah diterapkan ke area staging. Sekarang, Anda bisa “membatalkannya” secara parsial dan membuat commit baru.
git reset HEAD~(ini akan memindahkan perubahan dari commit besar ke area kerja Anda, tapi tidak ke staging).- Gunakan
git add -p(patch mode) untuk memilih bagian-bagian perubahan yang ingin Anda masukkan ke commit pertama. git commit -m "feat: new database schema for feature X"git add -plagi untuk bagian berikutnya.git commit -m "feat: backend logic for feature X"- Lakukan terus hingga semua perubahan dari commit besar tadi terpecah menjadi commit-commit yang lebih kecil.
-
Setelah selesai memecah, jalankan
git rebase --continue.
4.4. 🗑️ Menghapus Commit yang Tidak Diinginkan (Drop)
Terkadang ada commit yang benar-benar tidak relevan, misalnya commit hasil eksperimen yang tidak jadi dipakai.
Langkah-langkah:
-
Jalankan
git rebase -i HEAD~N. -
Ubah
pickmenjadidroppada baris commit yang ingin Anda hapus, atau cukup hapus baris commit tersebut.pick a1b2c3d feat: feature A drop e4f5g6h chore: testing random stuff pick i7j8k9l feat: feature B -
Simpan dan tutup editor. Commit tersebut akan hilang dari riwayat.
4.5. 🔄 Mengubah Urutan Commit (Reorder)
Anda mungkin ingin agar commit-commit lebih berurutan secara logis. Misalnya, Anda membuat commit perbaikan bug, lalu baru menyadari ada fitur lain yang harus diimplementasikan terlebih dahulu.
Langkah-langkah:
-
Jalankan
git rebase -i HEAD~N. -
Di editor, cukup potong dan tempel baris commit untuk mengubah urutannya.
# Sebelum (misal: fix B dilakukan setelah implement A, padahal harusnya sebelum A) pick a1b2c3d feat: implement feature A pick e4f5g6h fix: bug related to feature B # Sesudah (memindahkan fix B ke atas implement feature A) pick e4f5g6h fix: bug related to feature B pick a1b2c3d feat: implement feature A -
Simpan dan tutup editor. Git akan menerapkan commit dalam urutan baru.
5. Kapan Harus Menggunakan Rebase Interaktif? (⚠️ Peringatan Penting)
Ini adalah bagian paling penting dari artikel ini. Menggunakan git rebase -i sangat ampuh, tapi juga berbahaya jika tidak digunakan dengan benar.
⚠️ Aturan Emas: Hanya rebase commit yang BELUM PERNAH Anda push ke remote repository publik atau branch yang dibagikan dengan tim.
Kenapa?
Karena git rebase menulis ulang sejarah commit. Setiap kali Anda rebase, Git membuat commit baru dengan ID (hash) yang berbeda. Jika Anda rebase commit yang sudah di-push dan rekan tim sudah menarik (pull) perubahan tersebut, maka rekan tim memiliki riwayat “lama” dan Anda memiliki riwayat “baru” yang bertentangan. Ini akan menyebabkan:
- Konflik Merge yang Rumit: Rekan tim akan mengalami konflik saat mencoba pull perubahan Anda, atau Anda saat mencoba push.
- Kebingungan: Riwayat commit akan bercabang dan sulit dipahami, bahkan bisa menyebabkan kehilangan pekerjaan.
❌ Hindari: git push --force ke branch yang sudah dibagikan jika Anda tidak yakin 100% apa yang Anda lakukan. Ini akan menimpa riwayat di remote dan bisa menghapus pekerjaan orang lain.
✅ Gunakan dengan Aman: Jika Anda benar-benar harus rebase commit yang sudah di-push (misalnya, di branch fitur pribadi Anda yang belum di-merge ke main), dan Anda yakin tidak ada orang lain yang bekerja di branch tersebut, Anda bisa menggunakan git push --force-with-lease. Opsi --force-with-lease lebih aman daripada --force karena akan gagal jika ada orang lain yang sudah menambahkan commit ke branch remote sejak terakhir Anda pull.
🎯 Alternatif untuk Commit yang Sudah di-Push: Jika Anda perlu membatalkan perubahan dari commit yang sudah di-push, gunakan git revert. git revert membuat commit baru yang membatalkan efek dari commit sebelumnya, sehingga tidak menulis ulang sejarah dan aman untuk riwayat yang sudah dibagikan.
6. Tips dan Best Practices
-
Lakukan secara bertahap: Jika Anda baru belajar, jangan langsung mencoba rebase 50 commit sekaligus. Mulai dengan 2-3 commit.
-
Simpan salinan (opsional): Sebelum melakukan rebase yang kompleks atau penting, Anda bisa membuat branch sementara sebagai cadangan (
git branch backup-before-rebase) atau mencatat hash commit awal. -
Pesan commit yang jelas: Setelah rebase, pastikan pesan commit akhir Anda tetap informatif dan deskriptif. Ini adalah kesempatan Anda untuk menyempurnakan cerita Anda.
-
Gunakan
--autostash: Jika Anda memiliki perubahan lokal yang belum di-commit saat ingin rebase,git rebase -i --autostash HEAD~Nakan secara otomatis menyimpan perubahan Anda (stash), melakukan rebase, dan kemudian mengembalikannya (unstash). -
Pahami
git reflog: Ini adalah jaring pengaman Anda.git reflogmencatat setiap perubahan padaHEADAnda (termasuk rebase, reset, dll.). Jika Anda melakukan kesalahan fatal saat rebase, Anda bisa menggunakangit reset --hard <hash_dari_reflog>untuk kembali ke keadaan sebelumnya.git reflog # Outputnya mungkin seperti ini: # a1b2c3d (HEAD -> main) HEAD@{0}: rebase (finish): returning to refs/heads/main # ... # e4f5g6h HEAD@{5}: commit: Initial commit # ...Anda bisa mencari hash commit sebelum rebase yang salah dan kembali ke sana.
Kesimpulan
git rebase -i adalah salah satu alat paling kuat di gudang senjata seorang developer Git. Dengan menguasainya, Anda bisa menjaga riwayat Git Anda tetap bersih, rapi, dan mudah dipahami, yang pada akhirnya akan meningkatkan kualitas kode, mempercepat code review, dan mempermudah kolaborasi dalam tim.
Ingatlah selalu aturan emas: jangan rebase commit yang sudah dibagikan (di-push) ke repository publik. Gunakan hanya untuk membersihkan riwayat lokal Anda sebelum push. Dengan latihan dan pemahaman yang benar tentang risiko dan manfaatnya, Anda akan menjadi master dalam menyusun sejarah proyek Anda. Selamat mencoba!
🔗 Baca Juga
- Otomatisasi Workflow dengan Git Hooks Kustom: Kualitas Kode dan Penegakan Kebijakan di Tim Anda
- Docs as Code: Mengelola Dokumentasi Teknis Anda Seperti Kode untuk Kualitas, Konsistensi, dan Kolaborasi
- Git Internals: Memahami Cara Kerja Git di Balik Layar untuk Developer
- Code Review yang Efektif: Meningkatkan Kualitas Kode dan Kolaborasi Tim