Panduan

git cherry-pick: cara memindahkan satu commit ke branch lain

Diperbarui: · Skillaria.Top

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

FlagFungsiKapan dibutuhkan
-xMenambahkan baris «(cherry picked from commit …)» ke pesanSaat memindahkan perbaikan antar-branch publik, agar asalnya terlihat
-n, --no-commitMenerapkan perubahan ke index dan direktori kerja tanpa membuat commitIngin menggabungkan beberapa commit menjadi satu atau merevisi sebelum commit
-e, --editMembuka editor untuk mengubah pesanPesan perlu disesuaikan untuk branch tujuan
-s, --signoffMenambahkan baris Signed-off-byProyek yang mewajibkan DCO
-m 1Menentukan induk «utama» untuk merge commitMemindahkan merge commit
--ffMemajukan branch jika HEAD adalah induk dari commit yang dipilihJarang; mencegah pembuatan duplikat
--allow-emptyMengizinkan pemindahan commit yang memang kosong sejak awalCommit 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:

  1. Selesaikan lalu lanjutkan. Buka berkas, hapus penanda <<<<<<<, =======, dan >>>>>>>, sisakan versi yang benar, lalu jalankan git add src/discount.js dan git cherry-pick --continue.
  2. Lewati commit. Saat memindahkan daftar commit, git cherry-pick --skip akan melewati commit yang bermasalah dan lanjut ke berikutnya.
  3. Batalkan semuanya. git cherry-pick --abort mengembalikan 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-pickgit apply
SumberCommit yang ada di repositoriBerkas patch (diff)
Membuat commitYa (kecuali dengan -n)Tidak, hanya mengubah berkas (dengan --index juga mengubah index)
Mempertahankan penulis dan pesanYaTidak, karena patch tidak memuatnya
KonflikThree-way merge dengan penandaSecara default langsung gagal; dengan --3way muncul penanda
Perlu repositori yang samaYa, commit harus tersedia secara lokalTidak, 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.

Pelajari topik ini lewat video

Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.

Ke kursus