Kiraz seçiminin Git ile bir taahhüdü ne anlama geliyor?


2339

Son zamanlarda, cherry-pickbir taahhütte bulunmam istendi .

Peki git'de kiraz toplama taahhüdü ne anlama geliyor? Bunu nasıl yapıyorsun?


13
Birleştirme yerine, kiraz toplama ile bir daldan hedef dala (ör: ana) yeniden işleme daha kolaydır.
Levent Divilioğlu

Yanıtlar:


2858

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 mergeve rebasebunun gibi diğer yolların aksine .

  1. Taahhüdü uygulamak istediğiniz dalda olduğunuzdan emin olun.

    git checkout master
    
  2. Aşağıdakileri yürütün:

    git cherry-pick <commit-hash>
    

NB:

  1. 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.

  2. 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:


247
Herkese açık bir şubeden kiraz seçerseniz, kullanmayı düşünmelisiniz 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.
MBober

2
Kiraz toplama gerçekten gerekli mi? Benzer bir işi karışık bir sıfırlama veya yumuşak bir sıfırlama yapmayacak mısınız?
Nav

10
Taahhüde eklenmiş notlarınız varsa, kiraz toplamalarını takip etmediklerini unutmayın. git notes copy <from> <to>Onları da getirmek için kullanmalısın .
Zitrax

5
git push master değişiklik yapmak için son adım
iyi hissediyorum ve programlama

58
FYI: Bir taahhüt, o andaki çalışma ağacının tüm dosyalarını (ve bir önceki taahhüdün taahhüt karmasını) semantik olarak içerir, bu nedenle başka bir taahhüde bütün bir taahhüdü uygulamıyorsunuz, ancak bir taahhüdün bir önceki taahhütte yaptığı değişiklikler "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.
Emile Vrijdags

314

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: önce

sonra: sonra


12
kirazla toplanan taahhütler bazı dallarda (b1) alındığında ve daha sonra master'a teslim edildiğinde. Ve eğer (başlangıçta taahhütlerin alındığı) b1 dalı da master'a teslim edilmeye çalışılırsa. Çatışmalara ne dersiniz? Bu özenli mi yoksa nasıl çalışıyor?
parasrish

3
@parasrish Evet, önceki birleştirmelerinizle zaten ilgileniyorlar. Böylece (b1) dalından a, b, c, d değişikliklerini yaptınız. Kiraz sadece "c" yi seçtiniz. Daha sonra (b1) 'den master'a birleştikten sonra, "c" değişiklikleri aynı olduğundan, yalnızca a, b, d birleşir ve "c" değişiklikleri olarak kalır. Ancak birleştirme geri alırsanız, o zaman "c" ile değişiklikleri geri gidersiniz. Bunları ayrı ayrı geri almanız gerekir.
Teoman shipahi

12
Vurgulanmalıdır: Verilen örnekte, Z'ye sadece fark (F - E) uygulanır. Bu dar bir durumdur. Kiraz toplama, komşu olmayan iki komite arasındaki tüm farkların, örneğin, çoklu taahhütlerin farklılıklarını uygulamak için kullanılabilir. Örneğin, yukarıdakilerden sonra, (F - E), (E - D), (D - C) ve (C - B). Bu farkın uygulanmasına eşdeğerdir (F - B).
Thomas Bitonti

2
Ayrıca, seçilen Kurul (örnekte F) birden fazla öncekine sahipse ne olur?
Thomas Bitonti

2
Diğer bir deyişle, kiraz toplama sadece son taahhüt değişikliklerini alacaktır. 3 farklı kez taahhüt ederseniz ve sonuncuyu seçerseniz, birinci ve ikinci taahhütte değişiklik yapmaz. Birleştirme komutu tüm değişikliklerinizi alır ve hedef (ana) dalınıza uygulanır.
Teoman shipahi

157

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, hashdiğ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


96

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 .


3
Diğer yöne ihtiyacın olabilir. Master'daki bir hatayı düzelttiniz ve bunu yayınlamak için kiraz seçmelisiniz1. Ayrıca dallar yerine depolar olabilirler
canbax

1
Neden birleştirme kullanmıyorsunuz?
FreeLightman

Yaparım: şube serbest bırakma oluşturur, şube içinde düzeltir, serbest bırakma dalını birleştirir, master'da serbest bırakmayı birleştirir.
Jasper-M

57

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.

  1. hedef dalda kullanıma geç.
  2. git cherry-pick <commit id>
    

    Burada taahhüt kimliği, başka bir şubenin etkinlik kimliği.

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
  3. hedef şubeye it

Https://git-scm.com/docs/git-cherry-pick adresini ziyaret edin


43

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 .

  1. Kiraz-toplama önce
    (biz yapacağız kiraz almak ve işlemek Lşubesinden feature): resim açıklamasını buraya girin

  1. Komutu başlayarak git cherry-pick feature~2
    ( feature~22 nd önce taahhüt
    feature, yani taahhüt L): resim açıklamasını buraya girin

  1. ( git cherry-pick feature~2) Komutunu uyguladıktan sonra : resim açıklamasını buraya girin

Aynı animasyon: resim açıklamasını buraya girin


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 ).


Bu, şube yöneticisinde L 'N -> M -> L olacağı anlamına mı geliyor? ya da sadece ana dalda L taahhüt getirecek
Priyank Thakkar

1
@PriyankThakkar, evet, sadece L , başka hiçbir şey (resimlerden / animasyondan görebileceğiniz gibi).
MarianD

22

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-pickaçı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.


1
Bunu olaylara oldukça faydalı bir görünüm olarak görüyorum. cherry-pickHedef dal daha sonra kaynak dalda yeniden birleştirildiğinde neden nasıl davrandığını ima eder . Teşekkürler bayım.
Aluan Haddad

3
bir özellik yapıldıktan sonra git birleştirme yerine kiraz seçimini kullanmak istiyorum. herkes bir özelliği tamamladığında git merge feature_branch yapar. Neden kiraz toplama komutu kullanılmıyor? ? i kiraz alabilirsiniz eğer neden kaydedilmesini ezmek zahmet herhangi bir düşünce var mı
j2emanue

11

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-pickbir gelişme dalında ve mergebir serbest bırakma dalına taahhüt. Aynı şekilde, cherry-pickbir serbest bırakma dalından master'a bir de yapın. Voila


11

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


7

İş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.


Bu kafa karıştırıyor. Burada ustadan başka bir dalda olduğunu düşünüyorum, değil mi? Ve iki komisyondan bahsettiğinizde, kiraz seçmek istediğiniz aralığı tanımlamak için <from> ve <to> taahhütlerine atıfta bulunuyorsunuz. Doğru? Senaryo açıklanırsa çok yardımcı olacaktır. Yine de iyi bir ek. Teşekkürler.
Saurabh Patil

6

Mevcut şubenize belirli bir taahhüt uygulayacaktır.

Bunun anlamı :

  • bu taahhüt tarafından eklenen tüm dosyalar eklenecek
  • bu taahhüt tarafından silinen tüm dosyalar silinecek
  • bu işlem tarafından değiştirilen tüm dosyalar birleştirilir. Bu , yalnızca bu taahhütteki değişikliklerin değil , tüm taahhütteki dosyanın anlamına gelir !

Ö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.


0

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:

  1. Geçerli şube ve HEAD işaretçisi başarıyla yapılan son işlemde kalır.

  2. CHERRY_PICK_HEAD ref, uygulanması zor olan değişikliği getiren taahhüde işaret edecek şekilde ayarlanmıştır.

  3. Değişikliğin temiz uygulandığı yollar, hem dizin dosyasında hem de çalışma ağacınızda güncelleştirilir.

  4. Ç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.

Daha fazla oku...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.