Jawaban:
Memetik ceri di Git berarti memilih komit dari satu cabang dan menerapkannya pada yang lain.
Ini berbeda dengan cara-cara lain seperti merge
dan rebase
yang biasanya menerapkan banyak commit ke cabang lain.
Pastikan Anda berada di cabang tempat Anda ingin menerapkan komit.
git checkout master
Jalankan yang berikut ini:
git cherry-pick <commit-hash>
NB:
Jika Anda memilih dari cabang publik, Anda harus mempertimbangkan untuk menggunakan
git cherry-pick -x <commit-hash>
Ini akan menghasilkan pesan komit standar. Dengan cara ini, Anda (dan rekan kerja Anda) masih dapat melacak asal komit dan dapat menghindari penggabungan konflik di masa mendatang.
Jika Anda memiliki catatan yang terlampir pada komit, mereka tidak mengikuti cherry-pick. Untuk membawanya juga, Anda harus menggunakan:
git notes copy <from> <to>
Tautan tambahan:
git cherry-pick -x <commit-hash>
. Ini akan menghasilkan pesan komit standar. Dengan cara ini, Anda (dan rekan kerja Anda) masih dapat melacak asal komit dan dapat menghindari penggabungan konflik di masa mendatang.
git notes copy <from> <to>
untuk membawanya juga.
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
Kebanyakan ppl cenderung menganggap komit sebagai perubahan (seperti svn adalah iirc), tetapi tidak, masing-masing komit mengacu pada pohon kerja yang lengkap. Meskipun ini tidak membuat perbedaan dalam kasus ini, ini dapat membantu dalam memahami mengapa git bekerja seperti itu.
Kutipan ini diambil dari; Kontrol Versi dengan Git (Buku yang benar-benar hebat, saya mendorong Anda untuk membelinya jika Anda tertarik pada git)
Sunting: Karena jawaban ini masih terkesan, saya ingin menambahkan tutorial video aksi yang sangat bagus tentangnya:
Youtube: Pengantar Git-pick ceri
Menggunakan git cherry-pick Komit git cherry-pick commit menerapkan perubahan yang diperkenalkan oleh komit bernama pada cabang saat ini. Ini akan memperkenalkan komitmen baru yang berbeda. Sebenarnya, menggunakan git cherry-pick tidak mengubah riwayat yang ada dalam repositori; alih-alih, itu menambah sejarah. Seperti operasi Git lainnya yang memperkenalkan perubahan melalui proses penerapan diff, Anda mungkin perlu menyelesaikan konflik untuk sepenuhnya menerapkan perubahan dari komit yang diberikan . Perintah git cherry-pick biasanya digunakan untuk memperkenalkan commit tertentu dari satu cabang dalam repositori ke cabang lain. Penggunaan yang umum adalah untuk memforward atau back-port melakukan dari cabang pemeliharaan ke cabang pengembangan.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
sebelum:
setelah:
Memetik ceri di Git dirancang untuk menerapkan beberapa komit dari satu cabang ke cabang lainnya. Ini dapat dilakukan jika Anda mis. membuat kesalahan dan melakukan perubahan menjadi cabang yang salah, tetapi tidak ingin menggabungkan seluruh cabang. Anda bisa saja misalnya. kembalikan komit dan ambil-ceri di cabang lain.
Untuk menggunakannya, Anda hanya perlu git cherry-pick hash
, di mana hash
hash komit dari cabang lain.
Untuk prosedur lengkap, lihat: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Contoh singkat situasi, saat Anda membutuhkan cherry pick
Pertimbangkan skenario berikut. Anda memiliki dua cabang.
a) release1 - Cabang ini menuju ke pelanggan Anda, tetapi masih ada beberapa bug untuk diperbaiki.
b) master - cabang master klasik, di mana Anda dapat misalnya menambahkan fungsionalitas untuk release2.
SEKARANG : Anda memperbaiki sesuatu di rilis1 . Tentu saja Anda perlu perbaikan ini juga di master . Dan itu adalah kasus penggunaan khas untuk memetik ceri. Jadi cherry pick dalam skenario ini berarti bahwa Anda mengambil komit dari cabang release1 dan memasukkannya ke cabang master .
cherry-pick adalah fitur Git. Jika seseorang ingin melakukan komitmen tertentu dalam satu cabang ke cabang target, maka cherry-pick digunakan.
langkah git-pick ceri adalah seperti di bawah ini.
git cherry-pick <commit id>
Di sini, komit id adalah id aktivitas cabang lain.Eg.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Saya menyiapkan ilustrasi selangkah demi selangkah tentang apa yang dilakukan oleh cherry-pick - dan animasi dari ilustrasi ini (mendekati akhir).
git cherry-pick feature~2
feature~2
adalah 2 nd melakukan sebelum feature
, yaitu komit L
):
catatan:
Komit L'
adalah dari sudut pandang pengguna (komit = snapshot) salinan persis komit L
.
Secara teknis (internal), ini adalah komit baru, berbeda (karena mis. L
Berisi pointer ke K
(sebagai induknya), sementara L'
berisi pointer ke E
).
Anda dapat berpikir jika ceri memilih mirip dengan rebase, atau lebih tepatnya itu dikelola seperti rebase. Maksud saya, ini membutuhkan komit yang sudah ada dan regenerasi mengambil, sebagai titik awal, kepala cabang Anda saat ini.
A rebase
mengambil komit yang memiliki induk X dan meregenerasi komit seolah-olah itu benar-benar memiliki orangtua Y, dan inilah tepatnya yang cherry-pick
dilakukan oleh orangtua .
Cherry pick lebih banyak tentang bagaimana Anda memilih komit. Dengan pull
(rebase), git secara implisit meregenerasi komit lokal Anda di atas apa yang ditarik ke cabang Anda, tetapi dengan cherry-pick
Anda secara eksplisit memilih beberapa commit, dan secara implisit memperbanyaknya, di atas cabang Anda saat ini.
Jadi cara Anda melakukannya berbeda, tetapi di bawah tenda mereka adalah operasi yang sangat mirip - regenerasi dari komitmen.
cherry-pick
berperilaku seperti itu ketika cabang target kemudian digabungkan kembali ke cabang sumber. Terima kasih Pak.
Ini seperti Salin (dari suatu tempat) dan Tempel (ke suatu tempat), tetapi untuk komitmen tertentu.
Jika Anda ingin melakukan perbaikan terbaru, misalnya, maka Anda dapat menggunakan cherry-pick
fitur ini.
Apakah Anda cherry-pick
di cabang pengembangan, dan merge
yang berkomitmen untuk cabang rilis. Demikian juga, lakukan cherry-pick
dari cabang rilis ke master. Voila
Ketika Anda bekerja dengan tim pengembang pada suatu proyek, mengelola perubahan antara sejumlah cabang git bisa menjadi tugas yang kompleks. Terkadang Anda tidak ingin menggabungkan seluruh cabang menjadi yang lain, dan hanya perlu memilih satu atau dua komitmen tertentu. Proses ini disebut 'memetik ceri'.
Temukan artikel hebat tentang memetik ceri, periksa untuk detail lebih dalam: https://www.previousnext.com.au/blog/intro-cherry-picking-git
Jika Anda ingin menggabungkan tanpa melakukan id Anda dapat menggunakan perintah ini
git cherry-pick master~2 master~0
Perintah di atas akan menggabungkan tiga commit terakhir dari 1 menjadi 3
Jika Anda ingin melakukan ini untuk komit tunggal cukup hapus opsi terakhir
git cherry-pick master~2
Dengan cara ini Anda akan menggabungkan komit ke-3 dari ujung master.
Ini akan menerapkan komit tertentu ke cabang Anda saat ini.
Ini berarti :
Mis: Pertimbangkan komit A
added newFileA
modified main:
+ import './newFileA'
komit B
added newFileB
modified main:
+ import './newFileB'
Jika Anda memilih cheri komit B di cabang lain, Anda akan berakhir dengan:
/newFileB
/main :
import './newFileA'
import './newFileB'
karena commit B mengandung newFileB dan main , tetapi tidak ada newFileA , menghasilkan bug, jadi gunakan dengan hati-hati.
Kutipan dari dokumen resmi:
Diberi satu atau lebih komitmen yang ada, terapkan perubahan yang diperkenalkan masing-masing, dengan mencatat komitmen baru untuk masing-masing. Ini mengharuskan pohon kerja Anda bersih (tidak ada modifikasi dari komit HEAD).
Ketika tidak jelas cara menerapkan perubahan, hal berikut terjadi:
Cabang saat ini dan penunjuk HEAD tetap pada komit terakhir berhasil dibuat.
Ref CHERRY_PICK_HEAD diatur ke titik di komit yang memperkenalkan perubahan yang sulit diterapkan.
Jalur di mana perubahan yang diterapkan bersih diperbarui di file indeks dan di pohon kerja Anda.
Untuk jalur yang bertentangan, file indeks merekam hingga tiga versi, seperti yang dijelaskan di bagian "TRUE MERGE" pada git-merge. File pohon kerja akan menyertakan deskripsi konflik yang ditandai oleh penanda konflik biasa <<<<<<< dan >>>>>>>.
Tidak ada modifikasi lain yang dilakukan.