Bir dizi iş söz konusu olduğunda, kiraz toplama dır-dir oldu pratik değil.
Gibi aşağıda belirtilen tarafından Keith Kim , Git 1.7.2+ kaydedilmesini bir dizi-seçmenin kiraz yeteneğini tanıtıldı (ama yine de farkında olmak gerekir gelecekteki birleştirme amaçlı toplama kiraz sonucu )
git cherry-pick "bir dizi taahhüt seçmeyi öğrendi
(örn." cherry-pick A..B
"ve" cherry-pick --stdin
")," git revert
"yaptı; bunlar daha güzel sıralama kontrolünü desteklemiyor" rebase [-i]
"da var.
damian yorum yapar ve bizi uyarır:
" cherry-pick A..B
" A
Şeklinde daha büyük olmalıdırB
.
Eğer yanlış sıralarsa, komut sessizce başarısız olur .
Eğer almak istiyorsanız aralığı B
boyunca D
(dahil) olurdu B^..D
. Örnek olarak
" Git önceki taahhütler aralığından şube oluştursun mu? "
As Jubobs bahseder yorumlarda :
Bu B
bir kök taahhüdü olmadığını varsayar ; unknown revision
aksi takdirde " " hatası alırsınız .
Not: Git itibariyle 2.9.x / 2.10 (Q3 2016), yetim dalı (boş kafa) doğrudan taahhüt bir dizi kiraz-seçebilirsiniz: bkz " Nasıl GIT'de mevcut şube yetim yapmak ".
Orijinal cevap (Ocak 2010)
A rebase --onto
, daha iyi olurdu, burada Charles Bailey'nin burada açıkladığı gibi, entegrasyon dalınızın üstünde verilen taahhüdü tekrar oynatırsınız .
(ayrıca, pratik bir örnek görmek için git rebase man sayfasında "Bir şubeye dayalı bir konu dalını nasıl başka bir yere nakletirsiniz " konusuna bakın git rebase --onto
)
Mevcut dalınız entegrasyonsa:
# 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
Bu, aşağıdakiler arasındaki her şeyi yeniden oynatır:
- öğesinin üst öğesinden sonra
first_SHA-1_of_working_branch_range
(dolayısıyla ~1
): yeniden yürütmek istediğiniz ilk işlem
- "
integration
" e kadar ( working
şubeden tekrar oynatmak istediğiniz son işleme işaret eder )
" tmp
" (daha integration
önce nereye işaret ettiğini gösteren)
Bu taahhütlerden biri tekrar oynatıldığında herhangi bir çakışma olursa:
- ya çöz ve "
git rebase --continue
" komutunu çalıştır .
- veya bu yamayı atlayın ve "
git rebase --skip
" çalıştırın
- veya her şeyi "
git rebase --abort
" ile iptal edin (ve integration
dalı şubeye geri koyun tmp
)
Bundan sonra rebase --onto
, integration
geri sonunda olacak ( "olduğu entegrasyon şube taahhüt tmp
" dalı + tüm tekrarlattırılır kaydedilmesini)
Kiraz toplamada veya rebase --onto
unutma, burada tarif edildiği gibi sonraki birleşmelerde sonuçları vardır .
Saf bir " cherry-pick
" çözüm burada tartışılır ve şöyle bir şey içerir:
Bir yama yaklaşımı kullanmak istiyorsanız, "git format-patch | git am" ve "git cherry" seçeneklerinizdir.
Şu anda, git cherry-pick
taahhüt yalnızca tek kabul eder ancak aralığı belirleyip istiyorsanız B
aracılığıyla D
olurdu B^..D
git tabir de, bu yüzden
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Her neyse, bir dizi taahhüdü "tekrar oynamanız" gerektiğinde, "tekrar" kelimesi sizi rebase
Git'in " " özelliğini kullanmaya itmelidir.