git rebase memindahkan commit-commit branch-mu ke ujung branch lain, seolah kamu baru mulai bekerja dari sana. git cherry-pick menyalin satu commit tertentu dari branch lain ke branch-mu. Bayangin kamu menulis catatan di atas fotokopi bab kemarin, sementara bab aslinya sudah ditambah halaman baru. Rebase itu menyalin ulang catatanmu ke atas versi terbaru. Cherry-pick itu memetik satu catatan saja dan menyalinnya ke buku lain. Dua-duanya membuat salinan: kertas baru, bukan kertas yang sama.
🧪 Tebakan cepat: setelah
git rebase main, hash commit-commit di branchfitur-promotetap sama atau berubah? Tebak dulu, jawabannya ada di bagian "Rebase membuat commit baru".
Branch yang ketinggalan
Repo toko-kue. Branch fitur-promo dibuat dari b2d4f60 dan sudah punya 2 commit. Sementara itu main maju satu commit, c7e9a12 tambah footer.
e7a1b23---f8b2c34 fitur-promo
/
a1c3e5f---b2d4f60---c7e9a12 main
fitur-promo belum punya footer.html. Ada dua cara memasukkan commit baru main ke sana: git merge main (pelajaran merging), atau git rebase main.
git rebase main
$ git switch fitur-promo
Switched to branch 'fitur-promo'
$ git rebase main
Successfully rebased and updated refs/heads/fitur-promo.
a1c3e5f---b2d4f60---c7e9a12 main
\
4c8d2f1---9b3e6a7 fitur-promo
Yang dikerjakan rebase, langkah demi langkah:
- Cari commit yang cuma ada di
fitur-promo:e7a1b23danf8b2c34. - Pindah ke ujung
main, yaituc7e9a12. - Terapkan ulang perubahan tiap commit itu, satu per satu, jadi commit baru.
- Geser
fitur-promoke commit baru yang terakhir.
git checkout fitur-promo sama saja dengan git switch fitur-promo. Yang penting, rebase dijalankan dari branch yang mau dipindah, dengan nama branch tujuannya.
Rebase membuat commit baru
| Commit | Sebelum rebase | Sesudah rebase |
|---|---|---|
tambah banner promo |
e7a1b23, parent b2d4f60 |
4c8d2f1, parent c7e9a12 |
tambah diskon |
f8b2c34, parent e7a1b23 |
9b3e6a7, parent 4c8d2f1 |
Itu jawaban tebakannya: hash-nya berubah. Pesan dan perubahannya sama, tapi hash dihitung dari isi commit dan parent-nya, jadi parent baru berarti commit baru. Commit lama gak langsung hilang, cuma gak ada branch yang menunjuknya lagi (dia masih ketemu lewat reflog). Hash commit hasil rebase di Lab nanti beda dengan yang di sini.
Sekarang fitur-promo tinggal melanjutkan main, jadi menggabungkannya cukup fast-forward, tanpa merge commit:
$ git switch main
$ git merge fitur-promo
Updating c7e9a12..9b3e6a7
Fast-forward
Merge atau rebase?
git merge main |
git rebase main |
|
|---|---|---|
| Bentuk history | bercabang, ditambah satu merge commit | lurus (linear) |
| Commit lama | tetap, hash-nya sama | diganti salinan dengan hash baru |
| Aman untuk branch yang sudah di-push dan dipakai orang lain | ya | tidak |
Rebase untuk history yang bersih, merge untuk menyimpan history apa adanya. Aturan emasnya: rebase cuma di branch pribadi, yang belum di-push atau cuma kamu yang pakai. Kenapa? Rina sudah punya e7a1b23 dan f8b2c34 di laptopnya. Setelah kamu rebase, GitHub menolak push biasa (history-mu bukan kelanjutan lagi), dan kalau kamu paksa, history Rina dan history di GitHub jadi beda. Waktu dia pull, commit yang sama muncul dua kali, atau dia dapat conflict.
Kalau rebase berhenti karena conflict, bereskan file-nya, git add, lalu git rebase --continue. Mau batal dan kembali seperti sebelum rebase? git rebase --abort.
git cherry-pick: ambil satu commit saja
Di repo lain, fitur-promo punya 3 commit, dan yang tengah, d5c4b3a perbaiki typo harga, membetulkan menu.html ("Kue lapsi" jadi "Kue lapis"). Perbaikan itu harus masuk main sekarang, tapi fitur promonya belum siap.
$ git switch main
$ git cherry-pick d5c4b3a
[main 6a1f0e3] perbaiki typo harga
Date: Tue Oct 6 09:12:00 2026 +0700
1 file changed, 1 insertion(+), 1 deletion(-)
- Cherry-pick menyalin perubahan commit itu saja:
menu.htmldibetulkan,promo.htmldari commit lain difitur-promogak ikut. - Hasilnya commit baru,
6a1f0e3, dengan pesan yang sama.Dateadalah waktu commit aslinya dibuat. Hash-nya beda karena parent-nya beda. - Commit aslinya tetap di
fitur-promo. Waktu nantifitur-promodi-merge, Git biasanya tahu perubahannya sama.
📌 Merapikan commit sebelum PR: git rebase -i
git rebase -i HEAD~3 membuka daftar 3 commit terakhir di editor. Ganti kata pick di depan tiap baris: reword untuk mengganti pesan, squash untuk menggabung dengan commit di atasnya, fixup seperti squash tapi pesannya dibuang, drop untuk membuang commit. Simpan, dan Git menulis ulang commit-commit itu. Aturannya sama: cuma untuk commit yang belum di-push.
⚠️ Jebakan yang sering ketemu
- Rebase branch bersama. Kalau
fitur-promosudah di-push dan dipakai orang lain, pakaigit merge main, jangan rebase. - Rebase dari branch yang salah.
git rebase mainsambil berada dimaincuma bilangCurrent branch main is up to date.Pindah dulu ke branch yang mau dipindah. - Panik di tengah conflict. Rebase menunggu: bereskan,
git add,git rebase --continue, ataugit rebase --abort. - Cherry-pick banyak commit. Tiap cherry-pick bikin salinan. Kalau butuh hampir semua commit sebuah branch, merge saja.
TL;DR: git rebase main (dijalankan dari fitur-promo) memindahkan commit-commit fitur-promo ke ujung main, jadi history-nya lurus, tapi setiap commit-nya diganti salinan dengan hash baru. Karena itu rebase cuma untuk branch pribadi, dan merge untuk branch yang sudah dipakai bersama. Rebase untuk history bersih, merge untuk menyimpan history. git cherry-pick <hash> menyalin satu commit dari branch lain ke branch-mu sebagai commit baru.