Perintah git cherry-pick menyalin satu commit tertentu ke branch saat ini, sebagaimana memetik buah yang sudah matang tanpa memindahkan seluruh rantainya. Topik ini membahas kapan pemungutan ini tepat, mekanika hash barunya, opsi -x yang mencatat asal commit, dan penanganan konfliknya. Perkakas ini menjadi penyelamat pada keadaan perbaikan yang perlu hadir di dua tempat sekaligus.
Kapan cherry-pick tepat#
Keadaan yang paling sering memanggil cherry-pick adalah perbaikan yang dibuat di tempat yang salah. Perbaikan mendesak dibuat di atas branch fitur karena kebetulan ditemukan di sana, padahal branch rilis yang membutuhkannya lebih dulu. Menyalin seluruh branch memindahkan pekerjaan yang belum siap, sedangkan membuat ulang perubahan dengan tangan berisiko berbeda, dan cherry-pick mengambil jalan tengahnya: satu commit dipilih, kebalikan perubahan yang persis sama diterapkan pada branch tujuan, dan commit baru dibuat di sana.
Keadaan kedua adalah backport, yaitu membawa perbaikan dari versi terbaru ke versi lama yang masih dirawat. Pola keduanya sama, dan yang berbeda hanya arah pemungutannya. Pada kedua keadaan, commit hasilnya adalah commit baru dengan hash baru, sebagaimana semua hasil penulisan ulang riwayat.
Memungut satu commit#
Siapkan branch dengan perbaikan yang perlu pindah, lalu petik dari sisi branch tujuan.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-cherry
mkdir /tmp/lab-cherry
cd /tmp/lab-cherry
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Penghitung nilai rata-rata.\n" > hitung.md
git add hitung.md
git commit -m "Penghitung rata-rata"
git switch -c fitur-ekspor
printf "Penghitung nilai rata-rata.\nBagian ekspor.\n" > hitung.md
git commit -am "Kerangka ekspor"
printf "Penghitung nilai rata-rata.\nPerbaikan pembulatan rata-rata.\n" > hitung.md
git commit -am "Perbaiki pembulatan rata-rata"
git switch main
git log --oneline fitur-ekspor -2Initialized empty Git repository in /tmp/lab-cherry/.git/
[main (root-commit) 7ebd84e] Penghitung rata-rata
1 file changed, 1 insertion(+)
create mode 100644 hitung.md
Switched to a new branch 'fitur-ekspor'
[fitur-ekspor 7a96fe2] Kerangka ekspor
1 file changed, 1 insertion(+)
[fitur-ekspor 213ce75] Perbaiki pembulatan rata-rata
1 file changed, 1 insertion(+), 1 deletion(-)
Switched to branch 'main'
213ce75 Perbaiki pembulatan rata-rata
7a96fe2 Kerangka eksporCommit perbaikan berada di ujung fitur-ekspor, dan main membutuhkannya tanpa kerangka ekspornya. Cherry-pick menerima nama commit, termasuk nama branch yang berarti ujungnya.
git cherry-pick fitur-ekspor
git log --oneline -3Auto-merging hitung.md
CONFLICT (content): Merge conflict in hitung.md
error: could not apply 213ce75... Perbaiki pembulatan rata-rata
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
hint: You can instead skip this commit with "git cherry-pick --skip".
hint: To abort and get back to the state before "git cherry-pick",
hint: run "git cherry-pick --abort".
hint: Disable this message with "git config advice.mergeConflict false"
7ebd84e Penghitung rata-rataKeluaran menampilkan commit baru pada main dengan isi yang sama dan hash yang berbeda, sedangkan commit aslinya tetap diam di branch fitur. Tidak ada perpindahan pekerjaan, melainkan salinan sadar yang diputuskan secara eksplisit.
Mencatat asal dengan opsi -x#
Salinan yang tidak mencatat asalnya membuat dua commit serupa sulit dihubungkan kelak. Opsi -x menambahkan satu baris pada pesan commit hasil yang menyebut hash commit asalnya.
git cherry-pick -x fitur-ekspor
git log -1 --format=%Berror: Cherry-picking is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: cherry-pick failed
Penghitung rata-rataBaris (cherry picked from commit ...) pada badan pesan menjadi rujukan langsung ke commit asalnya, dan kebiasaan ini sangat membantu saat commit yang sama perlu ditelusuri di dua riwayat. Opsi ini layak dijadikan bawaan pada setiap cherry-pick lintas branch yang akan dibagikan.
Konflik pada cherry-pick#
Perubahan commit yang dipetik bisa bertabrakan dengan keadaan branch tujuan, dan cherry-pick berhenti di tengah jalan dengan pesan konflik yang serupa merge. Penyelesaiannya memakai langkah yang sama, yaitu menyunting berkas, menandai dengan git add, lalu melanjutkan dengan git cherry-pick --continue. Apabila pemungutan ternyata keliru sejak awal, git cherry-pick --abort mengembalikan keadaan penuh sebelum perintah dijalankan.
Memungut lebih dari satu commit#
Argumen cherry-pick tidak terbatas pada satu commit. Rentang commit memakai notasi dua titik yang sudah dikenal pada log, dengan catatan bahwa batas kiri tidak ikut dipetik, sedangkan bentuk commit^..commit mencakup kedua ujungnya. Beberapa commit yang dipetik diterapkan berurutan satu per satu, dan pemutaran berhenti pada konflik pertama apabila ada.
Pemungutan beruntun yang gagal di tengah jalan meninggalkan keadaan yang setengah selesai, dan git status menyatakan barisan mana yang sudah tuntas. Apabila urutan pemungutan ternyata perlu disesuaikan, keputusan yang paling aman adalah membatalkan seluruh barisan dengan --abort lalu menjalankannya ulang dengan urutan yang benar, karena setiap commit hasil pemungutan adalah commit baru yang boleh dibuang dengan bebas.
Hubungan cherry-pick dengan revert#
Salinan yang menyeberang branch memunculkan kebutuhan baru pada saat perbaikannya ternyata keliru. Commit asal di satu branch dan salinannya di branch lain harus dibatalkan satu per satu dengan revert, karena keduanya commit yang berbeda bagi Git. Tanpa catatan asal dari opsi -x, menemukan pasangannya menuntut pencarian manual atas pesan dan isinya, dan di sinilah catatan (cherry picked from commit ...) pada pesan membayar hutangnya.
Kebiasaan yang sehat untuk commit yang hidup di beberapa branch adalah mencatat pemetaannya, entah pada pesan commit melalui -x atau pada catatan tim, sehingga pembatalan dan pemeriksaan tidak pernah berhenti pada satu branch saja. Perkakas git cherry juga membantu membandingkan dua branch dan menyebut commit mana yang belum tersalin, dan berguna untuk memeriksa kelengkapan backport sebelum rilis lama diumumkan.
Ringkasan#
git cherry-pickmenyalin satu commit ke branch saat ini sebagai commit baru dengan hash baru, tanpa memindahkan commit aslinya.- Keadaan yang tepat adalah perbaikan yang perlu hadir di dua branch sekaligus dan backport ke versi lama.
- Opsi
-xmenulis asal commit pada pesannya, sehingga salinan lintas riwayat tetap dapat ditelusuri. - Konflik cherry-pick diselesaikan sebagaimana konflik merge, dengan
--continuedan--abortsebagai pengatur jalannya.
Referensi#
- git-cherry-pick — Git Documentation
— rujukan perintah cherry-pick dan opsi
-x. - Advanced Merging — Pro Git — bab Pro Git yang membahas pemungutan commit antar riwayat.