gitcherry-pickbranchMenengah5 mnt baca

Cherry-Pick: Memetik Satu Commit

Pindahkan satu commit ke branch lain dengan cherry-pick, atasi konfliknya, dan gunakan -x serta -n dengan benar.

Kenapa tidak merge saja?

Kadang kamu butuh SATU commit dari branch lain, bukan seluruh branch. Contoh nyata: ada hotfix penting di branch fitur-baru yang belum selesai, tapi bug yang sama harus segera diperbaiki di main. Merge seluruh branch akan menyeret pekerjaan setengah jadi. git cherry-pick mengambil diff satu commit dan menerapkannya di branch aktif sebagai commit baru. Kenapa perintah ini ada? Karena di dunia nyata, commit sering perlu "dipinjam" lintas branch tanpa membawa gerbongnya.

Cara pakai dasar

bash
git checkout main
git cherry-pick a1b2c33

Git mengambil perubahan commit a1b2c33 dan membuat commit baru di main dengan pesan yang sama. Perhatikan: hash commit barunya BERBEDA, karena parent-nya beda. Cherry-pick menduplikasi perubahan, bukan memindahkan commit aslinya. Commit asli tetap ada di branch sumber.

Untuk beberapa commit sekaligus, bisa rentang:

bash
git cherry-pick a1b2c33..d4e5f66

Ini memetik semua commit setelah a1b2c33 sampai d4e5f66. Hati-hati: rentang ini TIDAK termasuk a1b2c33 sendiri. Kalau mau termasuk, pakai a1b2c33^..d4e5f66.

Saat cherry-pick konflik

Kalau perubahan commit itu bertabrakan dengan isi main, Git berhenti dan menandai konflik seperti merge biasa:

bash
git cherry-pick a1b2c33
# error: could not apply a1b2c33... Perbaiki typo validasi
# hint: Resolve all conflicts manually, then run "git cherry-pick --continue"

Alurnya sama seperti resolve konflik merge: edit file, git add, lalu:

bash
git cherry-pick --continue   # lanjutkan setelah konflik beres
git cherry-pick --abort      # batalkan total, kembali seperti semula

Kenapa alurnya mirip merge? Karena secara teknis cherry-pick memang melakukan merge tiga arah antara parent commit sumber, commit sumber, dan HEAD-mu. Jadi semua skill resolve konflikmu tetap berlaku.

Flag -x: tinggalkan jejak asal

bash
git cherry-pick -x a1b2c33

Flag -x menambahkan baris di pesan commit: "(cherry picked from commit a1b2c33...)". Kapan dipakai? Saat cherry-pick lintas repo atau untuk hotfix penting, supaya 6 bulan kemudian orang bisa melacak "commit ini asalnya dari mana". Untuk cherry-pick kasual di repo sendiri, biasanya tidak perlu.

Flag -n: terapkan tanpa commit

bash
git cherry-pick -n a1b2c33

Flag -n (atau --no-commit) menerapkan perubahan ke working tree dan index TANPA membuat commit. Kapan dipakai? Saat kamu ingin menggabungkan beberapa cherry-pick jadi satu commit, atau ingin mengedit hasilnya dulu sebelum commit. Contoh: petik 3 commit terkait dengan -n tiga kali, rapikan, lalu git commit sekali dengan pesan yang lebih baik.

Kesalahan umum pemula

Salah: cherry-pick commit yang SUDAH ada di branch tujuan lewat merge sebelumnya, sehingga muncul duplikat perubahan dan konflik aneh. Benar: cek dulu dengan git log --oneline --grep="pesan commit" atau git branch --contains a1b2c33 apakah commit itu sudah masuk. Duplikat cherry-pick adalah sumber konflik yang membingungkan.

Salah: panik saat cherry-pick konflik dan menjalankan git reset --hard yang menghapus juga pekerjaan lain yang belum di-commit. Benar: pakai git cherry-pick --abort yang dirancang untuk membatalkan dengan aman tanpa menyentuh perubahan lain.

Tantangan

Petik hotfix ke branch main

Buat branch fitur, commit sebuah perbaikan kecil di sana. Kembali ke main dan cherry-pick commit itu dengan -x. Verifikasi dengan git log bahwa pesan commit memuat jejak asalnya, dan hash-nya berbeda dari commit asli.