Yanıtlar:
Git'te kiraz toplama, bir daldan bir taahhüt seçip başka bir dalda uygulamak anlamına gelir.
Bu, normalde başka bir şubeye birçok taahhüt uygulayan merge
ve rebase
bunun gibi diğer yolların aksine .
Taahhüdü uygulamak istediğiniz dalda olduğunuzdan emin olun.
git checkout master
Aşağıdakileri yürütün:
git cherry-pick <commit-hash>
NB:
Herkese açık bir şubeden kiraz alırsanız,
git cherry-pick -x <commit-hash>
Bu standartlaştırılmış bir tamamlama mesajı oluşturur. Bu şekilde, siz (ve iş arkadaşlarınız) taahhüdün kaynağını takip edebilir ve gelecekte birleşme çatışmalarından kaçınabilirsiniz.
Taahhüte eklenmiş notlarınız varsa, kiraz toplamalarını takip etmezler. Onları da getirmek için şunları kullanmalısınız:
git notes copy <from> <to>
Ek bağlantılar:
git cherry-pick -x <commit-hash>
. Bu standartlaştırılmış bir tamamlama mesajı oluşturur. Bu şekilde, siz (ve iş arkadaşlarınız) taahhüdün kaynağını takip edebilir ve gelecekte birleşme çatışmalarından kaçınabilirsiniz.
git notes copy <from> <to>
Onları da getirmek için kullanmalısın .
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
Çoğu ppl, taahhüdü değişiklikler olarak düşünme eğilimindedir (svn iirc gibi), ancak değil, her taahhüt tüm çalışma ağacını ifade eder. Bu, bu durumda bir fark yaratmasa da, git'in neden olduğu gibi çalıştığını anlamaya yardımcı olabilir.
Bu alıntı; Git ile Sürüm Kontrolü (Gerçekten harika bir kitap, git ile ilgileniyorsanız satın almanızı öneririm)
Düzenleme: Bu cevap hala izlenim alıyor, ben bu konuda eylem video öğretici çok güzel eklemek istiyorum:
Youtube: Git cherry-pick'a giriş
Git cherry-pick komutunu kullanma git cherry-pick komut komutu, geçerli dalda adlandırılmış komut tarafından getirilen değişiklikleri uygular. Yeni ve farklı bir taahhüt getirecek. Açıkça söylemek gerekirse, git cherry-pick kullanmak bir depodaki mevcut tarihi değiştirmez; bunun yerine, tarihe ekler. Bir fark uygulama süreci yoluyla değişiklik getiren diğer Git işlemlerinde olduğu gibi, verilen taahhüdün yaptığı değişiklikleri tam olarak uygulamak için çakışmaları çözmeniz gerekebilir . Git cherry-pick komutu tipik olarak bir havuz içindeki bir daldan farklı bir dal üzerine belirli taahhütleri tanıtmak için kullanılır. Yaygın bir kullanım, bir bakım branşından bir geliştirme branşına taahhütleri iletmek veya geri taşımaktır.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
önce:
sonra:
Git'te kiraz toplama, bir şubeden başka bir şubeye bir miktar taahhüt uygulamak için tasarlanmıştır. Örneğin yapılabilir. bir hata yaptı ve yanlış dalda bir değişiklik yaptı, ancak tüm dalı birleştirmek istemiyorum. Sadece örneğin. taahhüdü geri almak ve başka bir dalda kiraz almak.
Kullanmak için, sadece ihtiyacınız var git cherry-pick hash
, hash
diğer daldan bir taahhüt karması.
Tüm prosedür için bakınız: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Kiraz seçimine ihtiyacınız olduğunda kısa durum örneği
Şu senaryoyu düşünün. İki kolunuz var.
a) release1 - Bu şube müşterinize gidiyor, ancak hala düzeltilmesi gereken bazı hatalar var.
b) master - Örneğin release2 için işlevsellik ekleyebileceğiniz klasik master dalı.
ŞİMDİ : Sürüm1'deki bir şeyi düzeltiyorsunuz . Tabii ki bu düzeltmeye ustaca da ihtiyacınız var . Ve bu kiraz toplama için tipik bir kullanım durumudur. Yani bu senaryoda kiraz toplama, release1 dalından bir taahhüt almanız ve ana dala dahil etmeniz anlamına gelir .
cherry-pick bir Git özelliğidir. Birisi bir dalda belirli taahhütleri hedef bir dalda işlemek istiyorsa, kiraz toplama kullanılır.
git cherry-pick adımları aşağıdaki gibidir.
git cherry-pick <commit id>
Burada taahhüt kimliği, başka bir şubenin etkinlik kimliği.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Https://git-scm.com/docs/git-cherry-pick adresini ziyaret edin
Kiraz toplamanın ne yaptığını adım adım illüstrasyonlar ve bu illüstrasyonların bir animasyonunu (sonuna yakın) hazırladım .
Not:
Taahhüt L'
, kullanıcının bakış açısından (commit = anlık görüntü) taahhüdün tam kopyasıdır L
.
Teknik olarak (dahili olarak), yeni, farklı bir işlemdir (örneğin L
, K
(üst L'
öğesi olarak E
) için bir işaretçi içerdiğinden, bir işaretçi içerdiğinden ).
Bir vişnenin bir rebase'e benzediğini veya daha ziyade bir rebase gibi yönetildiğini düşünebilirsiniz. Bununla, mevcut bir taahhüdü alır ve başlangıç noktası olarak şu anda bulunduğunuz dalın başlığını alarak yeniden oluşturur.
A rebase
, X ebeveyni olan bir taahhüdü alır ve taahhüdü aslında bir ebeveyni Y'ye sahipmiş gibi yeniden oluşturur ve bu tam olarak a'nın yaptığı şeydir cherry-pick
.
Kiraz toplama, taahhütleri nasıl seçtiğiniz hakkında daha fazla. İle pull
(rebase), git örtük şubenize çekti ne üstünde yerel kaydedilmesini yeniden oluşturur, fakat cherry-pick
açıkça bazı (ler) işlemek seçin ve örtük mevcut şube üstünde onu (onları) yeniden.
Dolayısıyla, bunu yapma şekliniz farklıdır, ancak kaputun altında çok benzer işlemlerdir - taahhütlerin yenilenmesi.
cherry-pick
Hedef dal daha sonra kaynak dalda yeniden birleştirildiğinde neden nasıl davrandığını ima eder . Teşekkürler bayım.
Kopyalama (bir yerden) ve Yapıştır (bir yere) gibi, ancak belirli taahhütler için.
Örneğin, bir düzeltme yapmak istiyorsanız, cherry-pick
özelliği kullanabilirsiniz .
Yapılacaklar cherry-pick
bir gelişme dalında ve merge
bir serbest bırakma dalına taahhüt. Aynı şekilde, cherry-pick
bir serbest bırakma dalından master'a bir de yapın. Voila
Bir proje üzerinde geliştiricilerden oluşan bir ekiple çalışırken, git git kolları arasındaki değişiklikleri yönetmek karmaşık bir iş haline gelebilir. Bazen bir dalın tamamını bir başkasına birleştirmek istemezsiniz ve sadece bir veya iki belirli taahhüt seçmeniz gerekir. Bu işleme 'kiraz toplama' denir.
Kiraz toplama hakkında harika bir makale buldu, ayrıntılı bilgi için göz atın: https://www.previousnext.com.au/blog/intro-cherry-picking-git
İşleme kimlikleri olmadan birleştirmek istiyorsanız bu komutu kullanabilirsiniz
git cherry-pick master~2 master~0
Yukarıdaki komut, master'ın son üç taahhüdünü 1'den 3'e birleştirecektir.
Bunu tek bir taahhüt için yapmak istiyorsanız, sadece son seçeneği kaldırın
git cherry-pick master~2
Bu şekilde, master'ın sonundan itibaren 3. taahhüdü birleştireceksiniz.
Mevcut şubenize belirli bir taahhüt uygulayacaktır.
Bunun anlamı :
Örn: A taahhüdünü düşünün
added newFileA
modified main:
+ import './newFileA'
taahhüt B
added newFileB
modified main:
+ import './newFileB'
Başka bir dalda B taahhüdünü kiraz seçerseniz , aşağıdakilerle sonuçlanırsınız:
/newFileB
/main :
import './newFileA'
import './newFileB'
beri B taahhüt içeren newFileB ve ana , ancak hiçbir newFileA , bir hata ile sonuçlanır yüzden dikkatli kullanın.
Resmi dokümanlardan alıntı:
Mevcut bir veya daha fazla taahhüt verildiğinde, her birinin tanıttığı değişikliği uygulayın ve her biri için yeni bir taahhüt kaydedin. Bu, çalışma ağacınızın temiz olmasını gerektirir (HEAD taahhüdünde hiçbir değişiklik yapılmaz).
Bir değişikliğin nasıl uygulanacağı açık değilse, aşağıdakiler olur:
Geçerli şube ve HEAD işaretçisi başarıyla yapılan son işlemde kalır.
CHERRY_PICK_HEAD ref, uygulanması zor olan değişikliği getiren taahhüde işaret edecek şekilde ayarlanmıştır.
Değişikliğin temiz uygulandığı yollar, hem dizin dosyasında hem de çalışma ağacınızda güncelleştirilir.
Çakışan yollar için, dizin dosyası git-merge'nin "TRUE MERGE" bölümünde açıklandığı gibi en fazla üç sürümü kaydeder. Çalışma ağacı dosyaları, olağan çatışma belirteçleri tarafından köşeli parantezin bir açıklamasını içerecektir <<<<<<< ve >>>>>>>.
Başka değişiklik yapılmaz.