Kodeloka
  1. Kodeloka
  2. Kelas Git & CI/CD
  3. Materi

Git Fundamentals · Modul 4 dari 20

Rebase, Interactive Rebase & Menulis Ulang Riwayat

Merapikan commit sebelum di-review dengan rebase interaktif, memahami aturan emas rebase, dan memakai force-with-lease dengan aman.

1. Rebase vs Merge

Kondisi awal:
main     A───B───E───F
                \
fitur            C───D

Hasil MERGE:                    Hasil REBASE:
main  A─B─E─F───M               main  A─B─E─F
           \   /                            \
fitur       C─D                 fitur         C'──D'

Merge mempertahankan bentuk     Rebase MEMBUAT ULANG C dan D
sejarah apa adanya.             di atas F. Hash-nya berubah
                                menjadi C' dan D'.
⚠️ Rebase membuat commit BARU

C' bukan C yang dipindahkan — ia adalah commit baru dengan isi serupa tetapi hash berbeda, karena induknya berubah. Inilah akar dari seluruh aturan keselamatan rebase.

2. Rebase Dasar

git switch fitur/keranjang
git fetch origin
git rebase origin/main

# Bila ada konflik di tengah jalan:
#   selesaikan konflik di berkas
git add berkas-yang-konflik.js
git rebase --continue

git rebase --skip        # lewati commit ini
git rebase --abort       # batalkan semuanya, kembali seperti semula

3. Rebase Interaktif — Alat Perapi Utama

# Rapikan 5 commit terakhir
git rebase -i HEAD~5

# Rapikan semua commit sejak bercabang dari main
git rebase -i main

Sebuah editor akan terbuka:

pick 4a1de8f feat: tambahkan endpoint keranjang
pick 9c2b3f1 wip
pick 7e4a2d8 perbaiki typo
pick 2f8b1a4 feat: tambahkan validasi stok
pick 5d3c7e9 lupa hapus console.log
PerintahKegunaan
pickPakai commit apa adanya
rewordPakai commit, tapi ubah pesannya
editBerhenti di sini agar isinya bisa diubah
squashGabungkan ke commit di atasnya, pesan digabung
fixupGabungkan ke commit di atasnya, pesan dibuang
dropHapus commit ini sepenuhnya
reorderCukup pindahkan urutan barisnya
Hasil setelah disunting
pick   4a1de8f feat: tambahkan endpoint keranjang
fixup  9c2b3f1 wip
fixup  7e4a2d8 perbaiki typo
pick   2f8b1a4 feat: tambahkan validasi stok
fixup  5d3c7e9 lupa hapus console.log

# Hasil akhir: 2 commit bersih, bukan 5 commit berantakan
📌 Alur kerja --fixup yang sangat praktis
# Saat menemukan perbaikan untuk commit lama:
git commit --fixup 4a1de8f

# Nanti, gabungkan semuanya secara otomatis
git rebase -i --autosquash main
# Git sudah menyusun urutan fixup-nya sendiri.

Aktifkan permanen dengan git config --global rebase.autosquash true.

4. Aturan Emas Rebase

🚫 Jangan pernah rebase commit yang sudah dibagikan

Kalau Anda merebase main yang sudah dipakai sepuluh orang, hash seluruh commit berubah. Repositori lokal setiap orang akan menganggap ada puluhan commit "baru" yang sebenarnya duplikat, dan menyatukannya kembali sangat menyakitkan.

Aman untuk direbase: branch fitur pribadi yang hanya Anda yang pakai, bahkan bila sudah dipush.
Tidak boleh direbase: main, develop, branch rilis, atau branch fitur yang dikerjakan bersama orang lain.

5. Push Setelah Rebase: --force-with-lease

# BERBAHAYA -- menimpa apa pun yang ada di server
git push --force

# AMAN -- menolak bila ada commit baru dari orang lain
# yang belum pernah Anda lihat
git push --force-with-lease

# Lebih ketat lagi (Git modern)
git push --force-with-lease --force-if-includes
💡 Kenapa --force-with-lease lebih aman

Perintah ini memeriksa dulu apakah branch di server masih berada di posisi yang terakhir Anda ketahui. Bila rekan tim mendorong sesuatu sementara Anda melakukan rebase, push akan ditolak alih-alih diam-diam menghapus pekerjaan mereka. Jadikan ini kebiasaan permanen — --force polos hampir tidak pernah merupakan pilihan yang tepat.

6. Menyunting Commit Terakhir: --amend

# Perbaiki pesan commit terakhir
git commit --amend -m "pesan yang benar"

# Tambahkan berkas yang lupa ke commit terakhir, tanpa mengubah pesan
git add berkas-yang-lupa.js
git commit --amend --no-edit
⚠️ --amend juga menulis ulang riwayat

Perintah ini mengganti commit terakhir dengan commit baru berhash berbeda. Aman selama commit itu belum dipush; setelah dipush, Anda tetap butuh --force-with-lease.

7. Menyelamatkan Commit dari Branch Lain: cherry-pick

# Ambil satu commit spesifik ke branch sekarang
git cherry-pick 4a1de8f

# Ambil beberapa sekaligus
git cherry-pick 4a1de8f 9c2b3f1

# Ambil rentang commit
git cherry-pick main~5..main~2

# Ambil perubahannya saja, tanpa langsung commit
git cherry-pick -n 4a1de8f

Kasus paling umum: sebuah perbaikan mendesak sudah selesai di branch fitur, dan perbaikan itu perlu segera masuk ke produksi tanpa membawa serta seluruh fitur yang belum siap.

8. Menemukan Commit Penyebab Bug: bisect

git bisect start
git bisect bad                 # kondisi sekarang rusak
git bisect good v2.3.0         # versi ini masih baik

# Git memeriksakan commit di tengah. Uji, lalu beri tahu hasilnya:
git bisect good     # atau: git bisect bad
# Ulangi sampai Git menemukan commit penyebabnya.

git bisect reset               # kembali ke kondisi semula

# Otomatis penuh dengan skrip pengujian
git bisect run npm test
📌 Di sinilah commit atomik terbayar

bisect memakai pencarian biner: 1.000 commit selesai dalam sekitar 10 langkah. Tetapi ia hanya berguna bila tiap commit dapat dibangun dan diuji sendiri. Riwayat penuh commit "wip" yang rusak membuat bisect praktis tidak bisa dipakai — inilah alasan praktis kenapa merapikan commit dengan rebase interaktif itu penting.