GIT VERSION-CONTROL DEVELOPER-EXPERIENCE CODE-QUALITY COLLABORATION BEST-PRACTICES DEVOPS PRODUCTIVITY

Menguasai Git Rebase Interaktif: Jurus Rahasia Sejarah Git yang Bersih dan Rapi

⏱️ 12 menit baca
👨‍💻

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:

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:

📌 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:

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:

  1. feat: add user profile page
  2. fix: profile image not showing
  3. chore: remove console.log
  4. feat: add user bio field
  5. fix: 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:

  1. Jalankan git rebase -i HEAD~N, di mana N adalah jumlah commit yang ingin Anda rebase (misal: git rebase -i HEAD~5).

  2. Di editor, ubah aksi commit 2, 3, dan 5 menjadi squash atau fixup di bawah commit feat: add user profile page atau feat: 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
  3. Simpan dan tutup editor. Jika Anda menggunakan squash, editor akan muncul lagi untuk menggabungkan pesan commit. Jika fixup, pesan akan langsung dibuang.

  4. Hasilnya: Anda akan memiliki riwayat yang lebih ringkas, misalnya:

    1. feat: add user profile page (with fixes and cleanup)
    2. 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:

  1. Jalankan git rebase -i HEAD~N (misal: git rebase -i HEAD~2 jika commit yang salah adalah commit kedua dari belakang).

  2. Ubah pick menjadi reword pada baris commit yang ingin Anda ubah.

    pick a1b2c3d feat: initial login
    reword e4f5g6h feat: add user registrasion
  3. Simpan dan tutup editor. Git akan membuka editor lagi untuk Anda menulis pesan commit baru.

  4. 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:

Ini sulit di-review dan di-rollback. Kita bisa memecahnya.

Langkah-langkah:

  1. Jalankan git rebase -i HEAD~N pada commit yang terlalu besar.

  2. Ubah pick menjadi edit pada commit tersebut.

    pick a1b2c3d feat: small feature
    edit e4f5g6h feat: huge commit with everything
    pick i7j8k9l feat: another small feature
  3. Simpan dan tutup editor. Git akan berhenti setelah menerapkan commit e4f5g6h.

  4. 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 -p lagi 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.
  5. 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:

  1. Jalankan git rebase -i HEAD~N.

  2. Ubah pick menjadi drop pada 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
  3. 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:

  1. Jalankan git rebase -i HEAD~N.

  2. 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
  3. 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:

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

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