Ketika datang ke berbagai komitmen, memetik ceri adalah adalah tidak praktis.
Seperti yang disebutkan di bawah oleh Keith Kim , Git 1.7.2+ memperkenalkan kemampuan untuk memilih cherry-pick sejumlah komitmen (tetapi Anda masih perlu menyadari konsekuensi memetik cherry untuk penggabungan di masa depan )
git cherry-pick "belajar memilih serangkaian commit
(mis." cherry-pick A..B
"dan" cherry-pick --stdin
"), begitu juga" git revert
"; ini tidak mendukung kontrol sequencing yang lebih baik" rebase [-i]
"miliki.
komentar damian dan memperingatkan kita:
Dalam bentuk " cherry-pick A..B
", A
harus lebih tua dariB
.
Jika urutannya salah maka perintah akan gagal .
Jika Anda ingin memilih kisaran B
melalui D
(inklusif) yang akan B^..D
.
Lihat " Git membuat cabang dari rentang komit sebelumnya? " Sebagai ilustrasi.
Seperti Jubobs menyebutkan dalam komentar :
Ini mengasumsikan bahwa B
itu bukan komit root; Anda akan mendapat unknown revision
kesalahan " " sebaliknya.
Catatan: pada Git 2.9.x / 2.10 (Q3 2016), Anda dapat memilih berbagai komit langsung pada cabang yatim (kepala kosong): lihat " Bagaimana membuat cabang yang ada menjadi yatim di git ".
Jawaban asli (Januari 2010)
A rebase --onto
akan lebih baik, di mana Anda memutar ulang rentang komit yang diberikan di atas cabang integrasi Anda, seperti dijelaskan Charles Bailey di sini .
(juga, cari "Inilah cara Anda mentransplantasikan cabang topik berdasarkan satu cabang ke cabang lain" di halaman manual git rebase , untuk melihat contoh praktis dari git rebase --onto
)
Jika cabang Anda saat ini adalah integrasi:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
Itu akan memutar ulang semuanya antara:
- setelah induk dari
first_SHA-1_of_working_branch_range
(karenanya ~1
): komit pertama yang ingin Anda putar ulang
- hingga "
integration
" (yang menunjuk ke komit terakhir yang ingin Anda putar ulang, dari working
cabang)
ke " tmp
" (yang menunjuk ke tempat integration
menunjuk sebelumnya)
Jika ada konflik ketika salah satu dari komitmen itu diputar ulang:
- pecahkan dan jalankan "
git rebase --continue
".
- atau lewati tambalan ini, dan jalankan "
git rebase --skip
"
- atau membatalkan semua hal dengan "
git rebase --abort
" (dan meletakkan kembali integration
cabang di tmp
cabang)
Setelah itu rebase --onto
, integration
akan kembali pada komit terakhir dari cabang integrasi (yaitu tmp
cabang + "semua komitmen yang diputar ulang)
Dengan memetik ceri atau rebase --onto
, jangan lupa itu memiliki konsekuensi pada penggabungan berikutnya, seperti dijelaskan di sini .
cherry-pick
Solusi " " murni dibahas di sini , dan akan melibatkan sesuatu seperti:
Jika Anda ingin menggunakan pendekatan tambalan maka "git format-patch | git am" dan "git cherry" adalah pilihan Anda.
Saat ini, git cherry-pick
hanya menerima satu komit, tetapi jika Anda ingin memilih kisaran B
melalui D
yang akan B^..D
di git lingo, sehingga
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Tapi bagaimanapun, ketika Anda perlu "memutar ulang" serangkaian commit, kata "replay" akan mendorong Anda untuk menggunakan fitur " rebase
" Git.