git cherry-pick: cara memindahkan satu commit ke branch lain
git cherry-pick mengambil perubahan dari satu commit tertentu lalu membuat commit baru di branch aktif dengan diff dan pesan yang sama, tetapi hash berbeda. Pindah ke branch tujuan lalu jalankan git cherry-pick hash; jika terjadi konflik, perbaiki berkasnya, jalankan git add, lalu git cherry-pick --continue.
git cherry-pick memindahkan perubahan dari satu commit tertentu ke branch aktif tanpa menggabungkan seluruh branch. Git menghitung diff commit yang dipilih terhadap induknya, menerapkannya ke HEAD Anda, lalu membuat commit baru dengan penulis dan pesan yang sama, tetapi hash yang berbeda karena induknya juga berbeda.
Contoh kasusnya: di branch fitur Anda memperbaiki bug, dan perbaikan itu harus segera masuk ke branch rilis yang fiturnya belum siap. Menggabungkan seluruh branch fitur tidak bisa dilakukan, tetapi memindahkan satu commit bisa.
Cara memindahkan satu commit ke branch lain
Pertama, cari hash commit yang diinginkan. Lalu pindah ke branch tujuan dan jalankan cherry-pick.
# 1. Cari commit di branch feature
git log --oneline feature
a1b2c3d Perbaiki pembagian dengan nol pada perhitungan diskon
9f8e7d6 Tambahkan layar pembayaran baru
# 2. Pindah ke branch tujuan
git switch release-1.4
# 3. Pindahkan commit
git cherry-pick a1b2c3d
[release-1.4 4e5f6a7] Perbaiki pembagian dengan nol pada perhitungan diskon
Date: Mon Oct 5 14:12:03 2026 +0300
1 file changed, 3 insertions(+), 1 deletion(-)
Perhatikan bahwa commit baru mendapat hash 4e5f6a7, bukan a1b2c3d. Keduanya adalah objek berbeda dengan perubahan yang sama. Branch feature asalnya tidak berubah.
Alih-alih hash, Anda bisa memakai referensi commit lain: git cherry-pick feature mengambil commit terakhir di branch feature, dan git cherry-pick feature~2 mengambil commit ketiga dari belakang.
Cara memindahkan beberapa commit
Dengan daftar
Hash dapat diberikan dalam bentuk daftar. Git akan menerapkannya sesuai urutan yang Anda tulis, dan membuat commit baru sebanyak itu.
git cherry-pick a1b2c3d 7c8d9e0 3f4a5b6
Urutan penting: jika commit kedua bergantung pada commit pertama, tetapi Anda menuliskannya terbalik, hasilnya bisa konflik atau kode yang rusak. Lebih aman menuliskan dari yang lama ke yang baru.
Dengan rentang
Untuk commit yang berurutan, gunakan sintaks rentang. Di sini ada jebakan yang hampir selalu membuat orang tersandung: A..B berarti «commit yang dapat dicapai dari B tetapi tidak dari A», sehingga A sendiri tidak termasuk dalam rentang.
# Memindahkan commit SETELAH A sampai B termasuk
git cherry-pick A..B
# Memindahkan A dan semua commit sampai B
git cherry-pick A^..B
Jika ingin memindahkan semua commit yang ada di branch feature tetapi tidak ada di main, penulisan git cherry-pick main..feature bisa dipakai. Namun jika commit-nya sangat banyak, pertimbangkan apakah yang Anda butuhkan sebenarnya rebase atau merge, bukan cherry-pick.
Flag git cherry-pick yang berguna
| Flag | Fungsi | Kapan dibutuhkan |
|---|---|---|
-x | Menambahkan baris «(cherry picked from commit …)» ke pesan | Saat memindahkan perbaikan antar-branch publik, agar asalnya terlihat |
-n, --no-commit | Menerapkan perubahan ke index dan direktori kerja tanpa membuat commit | Ingin menggabungkan beberapa commit menjadi satu atau merevisi sebelum commit |
-e, --edit | Membuka editor untuk mengubah pesan | Pesan perlu disesuaikan untuk branch tujuan |
-s, --signoff | Menambahkan baris Signed-off-by | Proyek yang mewajibkan DCO |
-m 1 | Menentukan induk «utama» untuk merge commit | Memindahkan merge commit |
--ff | Memajukan branch jika HEAD adalah induk dari commit yang dipilih | Jarang; mencegah pembuatan duplikat |
--allow-empty | Mengizinkan pemindahan commit yang memang kosong sejak awal | Commit kosong untuk keperluan tertentu |
Untuk apa -x
Enam bulan kemudian, seseorang melihat perbaikan di branch rilis dan ingin tahu asalnya. Baris yang ditambahkan oleh -x memberikan jawabannya langsung:
git cherry-pick -x a1b2c3d
git log -1
Perbaiki pembagian dengan nol pada perhitungan diskon
(cherry picked from commit a1b2c3d4e5f60718293a4b5c6d7e8f9012345678)
Gunakan -x ketika commit asal sudah dipublikasikan. Jika Anda memindahkan dari branch lokal yang nantinya akan dihapus, tautannya tidak akan mengarah ke mana pun, jadi flag ini tidak diperlukan.
Menggabungkan beberapa commit menjadi satu: -n
git cherry-pick -n a1b2c3d 7c8d9e0
git status # perubahan kedua commit ada di index
git commit -m "Perbaikan perhitungan diskon"
Konflik saat cherry-pick dan cara mengatasinya
Konflik terjadi ketika perubahan dari commit tidak cocok dengan kode yang ada sekarang: di branch tujuan, baris yang sama sudah tampil berbeda. Git berhenti dan memberi tahu Anda.
git cherry-pick a1b2c3d
Auto-merging src/discount.js
CONFLICT (content): Merge conflict in src/discount.js
error: could not apply a1b2c3d... Perbaiki pembagian dengan nol pada perhitungan diskon
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
Setelah itu ada tiga pilihan:
- Selesaikan lalu lanjutkan. Buka berkas, hapus penanda
<<<<<<<,=======, dan>>>>>>>, sisakan versi yang benar, lalu jalankangit add src/discount.jsdangit cherry-pick --continue. - Lewati commit. Saat memindahkan daftar commit,
git cherry-pick --skipakan melewati commit yang bermasalah dan lanjut ke berikutnya. - Batalkan semuanya.
git cherry-pick --abortmengembalikan branch ke keadaan sebelum operasi dimulai.
Ada juga git cherry-pick --quit: perintah ini menghentikan operasi tetapi tetap menyimpan commit yang sudah berhasil diterapkan dan kondisi berkas saat ini. Ini berguna jika separuh daftar sudah berhasil dipindahkan dan Anda ingin melanjutkan secara manual.
Jika konflik yang sama terus berulang (misalnya Anda rutin memindahkan perbaikan ke beberapa branch rilis), aktifkan git config rerere.enabled true. Git akan mengingat cara Anda menyelesaikan konflik dan menerapkannya secara otomatis pada kejadian berikutnya.
Memindahkan merge commit
Merge commit memiliki dua induk, dan Git tidak tahu terhadap induk mana diff harus dihitung. Tanpa petunjuk, Anda akan mendapat error:
git cherry-pick 5d6e7f8
error: commit 5d6e7f8 is a merge but no -m option was given.
Flag -m 1 berarti: hitung perubahan terhadap induk pertama, yang biasanya adalah branch tempat penggabungan dilakukan. Dengan cara ini, semua yang dibawa oleh branch yang digabung dipindahkan dalam satu commit.
git cherry-pick -m 1 5d6e7f8
Perlu diingat bahwa setelah ini Git tidak menganggap branch tersebut sudah tergabung. Saat merge berikutnya, Git bisa mencoba menerapkan perubahan yang sama untuk kedua kalinya.
git cherry-pick dan git apply: apa bedanya
git apply sering disebut bersama cherry-pick karena keduanya «menerapkan perubahan». Namun sumber datanya berbeda.
| git cherry-pick | git apply | |
|---|---|---|
| Sumber | Commit yang ada di repositori | Berkas patch (diff) |
| Membuat commit | Ya (kecuali dengan -n) | Tidak, hanya mengubah berkas (dengan --index juga mengubah index) |
| Mempertahankan penulis dan pesan | Ya | Tidak, karena patch tidak memuatnya |
| Konflik | Three-way merge dengan penanda | Secara default langsung gagal; dengan --3way muncul penanda |
| Perlu repositori yang sama | Ya, commit harus tersedia secara lokal | Tidak, patch bisa dikirim lewat cara apa pun |
Contoh penggunaan git apply saat commit tidak ada di repositori Anda, misalnya rekan Anda mengirim diff dalam bentuk berkas:
# Rekan Anda menjalankan
git diff main..fix-discount > fix.patch
# Anda memeriksa dan menerapkannya
git apply --check fix.patch # cek apakah patch bisa diterapkan
git apply fix.patch # terapkan ke direktori kerja
git apply --3way fix.patch # jika ada perbedaan, muncul penanda konflik
Jika Anda ingin mengirim commit secara utuh, lengkap dengan penulis dan pesannya, gunakan pasangan git format-patch dan git am: yang pertama menyimpan commit ke berkas, yang kedua membuat commit dari berkas tersebut. Secara prinsip ini adalah cherry-pick «lewat email».
Cherry-pick dari repositori lain juga bisa dilakukan: tambahkan repositori itu sebagai remote, jalankan git fetch, dan commit-nya akan tersedia lewat hash.
Kapan cherry-pick adalah ide yang buruk
Cherry-pick membuat duplikat: perubahan yang sama hidup dalam riwayat dengan dua hash. Dalam jumlah kecil ini wajar, tetapi ada skenario yang justru merugikan.
- Memindahkan puluhan commit. Jika hampir seluruh branch harus dipindahkan, gunakan rebase atau merge. Cherry-pick akan menghasilkan riwayat duplikat yang panjang dan lebih banyak konflik.
- Pemindahan dua arah. Commit dipindahkan dari feature ke main, lalu feature digabung ke main. Git biasanya bisa mengatasinya (perubahannya identik), tetapi jika setelah pemindahan baris tersebut diubah lagi, konflik bisa muncul di tempat yang tidak diduga.
- Commit yang saling bergantung. Sebuah commit memakai fungsi yang ditambahkan dua commit sebelumnya. Cherry-pick hanya memindahkan commit itu sendiri, sehingga kode di branch tujuan tidak akan ter-build. Selalu periksa build dan tes setelah pemindahan.
Praktik yang baik untuk hotfix adalah membuat perbaikan langsung di branch tertua yang masih didukung, lalu menggabungkannya ke branch yang lebih baru. Dengan begitu, cherry-pick hanya dipakai sebagai pengecualian.
Cara membatalkan cherry-pick
Jika operasi masih berjalan (ada konflik), jalankan git cherry-pick --abort. Jika commit sudah dibuat tetapi belum dikirim ke server, hapus saja:
git reset --hard HEAD~1
Jika commit sudah di-push ke branch bersama, riwayat tidak boleh ditulis ulang. Buat commit kebalikannya:
git revert 4e5f6a7
Dan jika Anda sudah menjalankan reset lalu berubah pikiran, commit yang hilang bisa ditemukan lewat git reflog.
Cara memeriksa apakah commit sudah dipindahkan
Karena hash-nya berbeda, git branch --contains biasa tidak membantu. Git dapat membandingkan commit berdasarkan isi perubahannya (patch-id):
git cherry -v release-1.4 feature
- a1b2c3d Perbaiki pembagian dengan nol pada perhitungan diskon
+ 9f8e7d6 Tambahkan layar pembayaran baru
Tanda minus berarti perubahan yang setara sudah ada di release-1.4, tanda plus berarti belum ada. Alternatifnya adalah git log --cherry-pick --oneline release-1.4...feature, yang menyembunyikan commit kembaran. Jika Anda memakai -x, Anda juga bisa mencari berdasarkan pesan: git log --grep="cherry picked from commit a1b2c3d".
Ringkasan
git cherry-pick adalah alat untuk operasi yang tepat sasaran: memindahkan hotfix ke rilis, mengambil commit yang berguna dari branch yang sudah ditinggalkan, atau memulihkan commit yang tidak sengaja dibuat di tempat yang salah. Ingat tiga hal: commit baru selalu mendapat hash baru, rentang A..B tidak menyertakan A, dan untuk branch publik sebaiknya tambahkan -x. Jika yang ingin dipindahkan adalah diff dari sebuah berkas, gunakan git apply. Rebase, stash, cherry-pick, dan tag dibahas secara mendalam dengan praktik dalam kursus Git.
Pertanyaan umum
Apakah cherry-pick mengubah branch asal?
Tidak. Commit asal tetap di tempatnya, dan di branch aktif muncul salinannya dengan hash baru.
Bisakah melakukan cherry-pick commit dari branch remote?
Bisa. Jalankan git fetch, setelah itu commit tersedia lewat hash atau sebagai origin/nama-branch, dan bisa diberikan ke git cherry-pick.
Mengapa hash commit berubah setelah cherry-pick?
Hash dihitung dari induk, waktu commit, dan isi pohon. Salinan memiliki induk yang berbeda serta waktu committer yang berbeda, sehingga hash-nya juga berbeda.
Apakah penulis asli commit dipertahankan saat cherry-pick?
Ya. Penulis dan tanggal penulisan diambil dari commit asli, sedangkan committer adalah Anda dengan tanggal saat ini.
Apa yang harus dilakukan jika cherry-pick menyatakan commit kosong?
Berarti perubahan tersebut sudah ada di branch tujuan. Lewati dengan git cherry-pick --skip, atau catat sebagai commit kosong dengan git commit --allow-empty.
Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.
Ke kursus