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'.
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
| Perintah | Kegunaan |
|---|---|
pick | Pakai commit apa adanya |
reword | Pakai commit, tapi ubah pesannya |
edit | Berhenti di sini agar isinya bisa diubah |
squash | Gabungkan ke commit di atasnya, pesan digabung |
fixup | Gabungkan ke commit di atasnya, pesan dibuang |
drop | Hapus commit ini sepenuhnya |
reorder | Cukup pindahkan urutan barisnya |
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
--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
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
--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
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.