Ustamdan iki şubem var:
- v2.1 : (sürüm 2) Birkaç aydır çalışıyorum
- wss : dün efendime belirli bir özellik eklemek için yarattığım (üretimde)
Dünkü taahhütleri wss'den v2.1'e kopyalamanın bir yolu var mı?
Ustamdan iki şubem var:
Dünkü taahhütleri wss'den v2.1'e kopyalamanın bir yolu var mı?
Yanıtlar:
Bunu birleştirerek gerçekten yapmanıza izin veren bir iş akışınız olmalıdır:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (wss)
Tek yapmanız gereken git checkout v2.1
ve git merge wss
. Herhangi bir nedenle bunu gerçekten yapamazsanız ve wss şubenizi doğru yere taşımak için git rebase'i kullanamazsanız , bir yerden tek bir taahhüt alma ve başka bir yere uygulama komutu git cherry-pick'tur . Sadece uygulamak istediğiniz dalı kontrol edin ve çalıştırın git cherry-pick <SHA of commit to cherry-pick>
.
Rebase'nin sizi kurtarabileceği yollardan bazıları:
Geçmişiniz şöyle görünüyorsa:
- x - x - x (v2) - x - x - x (v2.1)
\
x - x - x (v2-only) - x - x - x (wss)
git rebase --onto v2 v2-only wss
Wss'yi doğrudan v2'ye taşımak için kullanabilirsiniz :
- x - x - x (v2) - x - x - x (v2.1)
|\
| x - x - x (v2-only)
\
x - x - x (wss)
Sonra birleştirebilirsiniz! Gerçekten, gerçekten, gerçekten birleştirebileceğiniz noktaya ulaşamazsanız, aynı anda birkaç kiraz seçmeyi etkili bir şekilde yapmak için rebase'i kullanabilirsiniz:
# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase
Not: Bunu yapmak için fazladan çalışma gerektirmesinin nedeni, deponuzda yinelenen taahhütler oluşturmasıdır. Bu gerçekten iyi bir şey değil - kolay dallanma ve birleştirmenin tüm amacı, taahhütleri tek bir yer haline getirerek ve ihtiyaç duydukları yerde birleştirerek her şeyi yapabilmektir. Yinelenen taahhütler, bu iki dalı asla birleştirmeyecek bir niyet anlamına gelir (daha sonra yapmak istediğinize karar verirseniz çatışma yaşarsınız).
git-svn-id
girmeden önce yanlış referansları kaldırmak için etkileşimli bir rebase / reword gerçekleştirdim dcommit
. Gerçi kiraz toplama adımını dışarıda bırakmış ve tek başına bir rebase kullanmış olabilirdim.
kullanım
git cherry-pick <commit>
mevcut şubenize başvurmak <commit>
için .
Kendim muhtemelen seçtiğim taahhütleri çapraz kontrol edip gitk
yerine taahhüt girişine sağ tıklamayla vişne seçerdim.
Daha otomatik gitmek istiyorsanız (tüm tehlikeleriyle) ve dünden beri tüm taahhütleri varsayarsak wss'de taahhütlerin listesini oluşturabilirsiniz git log
( --pretty
Jefromi tarafından önerilen)
git log --reverse --since=yesterday --pretty=%H
yani her şeyi birlikte kullandığınız varsayılarak bash
for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
git cherry-pick $commit
done
Burada bir şeyler ters giderse (çok fazla potansiyel var) bu canlı ödeme işleminde çalıştığından beladasınız, bu yüzden manuel kiraz seçimleri yapın veya Jefromi tarafından önerilen gibi rebase kullanın.
git rebase
daha sağlam olduğunu belirtmek isterim. Özellikle, böyle bir for döngüsü kullanmak, kiraz seçimlerinden biri başarısız olursa, yine de geri kalanını yapmaya çalışacaktır. Bu ... çok çok iyi değil, diyelim.
git
cevabın ne kadar iyi bildiğini kanıtlamak için git'in karmaşıklıklarını dolamak yerine basit ve doğrudan çözüme yönelik bir cevap.
git cherry-pick
: Mevcut bazı taahhütlerin getirdiği değişiklikleri uygulayın
Varsayalım ki (X, Y, Z) taahhütleri olan A dalımız var. Bu taahhütleri B şubesine eklememiz gerekiyor . cherry-pick
Operasyonları kullanacağız .
Kullandığımızda cherry-pick
, B şubesine taahhütlerin A Şubesinde göründüğü kronolojik sırada eklemeliyiz .
cherry-pick bir dizi taahhüdü destekler, ancak bu aralıkta birleştirme taahhütleriniz varsa, gerçekten karmaşıklaşır
git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z
İş akışı örneği:
Seçeneklerlecherry-pick
birlikte kullanabiliriz
-e veya --edit : Bu seçenekle git cherry-pick taahhütte bulunmadan önce tamamlama mesajını düzenlemenizi sağlar.
-n veya --no-commit : Genellikle komut otomatik olarak bir dizi işlem gerçekleştirir. Bu bayrak, herhangi bir taahhütte bulunmadan çalışma ağacınıza ve dizine adlandırılmış her bir taahhüdü kiraz seçmek için gerekli değişiklikleri uygular. Ayrıca, bu seçenek kullanıldığında, dizininizin HEAD taahhüdüyle eşleşmesi gerekmez. Kiraz toplama endeksinizin başlangıç durumuna karşı yapılır.
İlginç bir Buraya yazı ile ilgili cherry-pick
.
Sen olabilir bir yama oluşturmak kopyalayıp istediğiniz kaydedilmesini gelen yama uygulamak hedef dalına.
git format-patch <revision range>
ve git am *.patch
.
checkout
Başka bir dal gerektiriyor .
Veya evangelist tarafında biraz daha az iseniz, kullandığım biraz çirkin bir şekilde yapabilirsiniz. Deploy_template'te, şube konuşlandırması olarak yöneticime kopyalamak istediğim taahhütler var
git branch deploy deploy_template
git checkout deploy
git rebase master
Bu, deploy_template üzerinde yeni şube dağıtımı (varolan konuşlandırma dalının üzerine yazmak için -f kullanıyorum) oluşturur, ardından bu yeni dalı master üzerine yeniden oluşturur ve deploy_template'e dokunulmaz.
Cherry-pick komutu standart girişten taahhütlerin listesini okuyabilir.
Aşağıdaki komut "kiraz" seçtikleri John kullanıcı tarafından yazılır "geliştirme" dalında var ama "sürüm" dalında değil, ve bunu kronolojik sırada yapar.
git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin