Git Rebase & Cherry-pick — Git

Git Rebase adalah alternatif merge untuk menggabungkan branch — menghasilkan history yang linear dan bersih. Merge vs Rebase: Merge: Rebase: A─B─C─────M…

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 branch fitur-promo tetap 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:

  1. Cari commit yang cuma ada di fitur-promo: e7a1b23 dan f8b2c34.
  2. Pindah ke ujung main, yaitu c7e9a12.
  3. Terapkan ulang perubahan tiap commit itu, satu per satu, jadi commit baru.
  4. Geser fitur-promo ke 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(-)

📌 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

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.

Yang akan kamu pelajari