Ne zaman dallanmalısın?


Yanıtlar:


59

Dallanma için çeşitli kullanımlar vardır. En yaygın kullanımlardan biri, bir zamanlar ortak bir kod tabanına sahip olan projeleri ayırmaktır. Bu, ana gövdeyi etkilemeden kodunuzu denemek için çok kullanışlıdır.

Genel olarak, iki dal türü görürsünüz:

  • Özellik Şube: Belirli bir özellik, tüm geliştirme ekibinin erken aşamalarında etkilenmesini istemeyecek kadar yıkıcıysa, bu çalışmayı yapmak için bir dal oluşturabilirsiniz.

  • Düzeltmeler Şubesi: Ana gövdede geliştirme devam ederken, düzeltmeleri yazılımın en son yayımlanan sürümünde tutmak için bir düzeltme dalı oluşturulabilir.

Dallanma ilkelerini ve bunları ne zaman kullanacağınızı açıklayan aşağıdaki makaleye göz atmak ilginizi çekebilir:


Bahsettiğiniz ortak kullanımı hiç duymadım veya düşünmedim ama bu gerçekten harika bir fikir. Bunu gelecek projede gerçekten kullanabilirim. Gösterdiğiniz için teşekkürler.
Nils Riedemann

82

Genel anlamda, dallanmanın temel amacı (bir VCS - Sürüm Kontrol Sistemi - özelliği) kod izolasyonu elde etmektir .

Sıralı geliştirme için yeterli olabilecek ve aynı benzersiz dalda kaydedilen (işlenen) birçok görev için kullanılan en az bir dalınız var .

Ancak bu model hızlı bir şekilde sınırını gösterir:

Bir geliştirme çabanız olduğunda (yeniden düzenleme, geliştirme, hata düzeltmeleri, ...) ve bu değişiklikleri aynı dalda mevcut geliştirme dalınızla güvenli bir şekilde yapamayacağınızı fark ettiğinizde (çünkü API'yi kırarsınız veya bozacak kodu her şey), o zaman başka bir şubeye ihtiyacınız var .
( İki kod seti daha sonra birleştirilecek olsa bile, eski kod için bu yeni kodu izole etmek için)

İşte cevabınız şudur:
Bir dalda iki geliştirme çabası sürdüremediğinizde ve kaydedemediğinizde dallanmalısınız.
(sürdürmek için korkunç derecede karmaşık bir geçmişe sahip olmadan).


Bir dal, kaynak kodu üzerinde çalışan tek kişi olsanız bile veya çok sayıda iseniz faydalı olabilir.
Ancak "geliştirici başına bir dal" yapmamalısınız:
"izolasyon" amacı, bir geliştirme çabasını izole etmek için yapılmıştır ("yazılımımızın bir sonraki sürümünü geliştirelim" kadar genel veya "haydi düzeltelim" kadar özel bir görev hata 23 "),
bir" kaynağı "izole etmek için değil .

("VonC" adlı bir dal başka bir geliştirici için hiçbir şey ifade etmez: Ya "VonC" projeden ayrılırsa? Onunla ne yapmanız gerekir?
"bugfix_212" adlı bir dal, örneğin bir hata izleme sistemi bağlamında yorumlanabilir ve herhangi bir geliştirici onu en azından onunla ne yapması gerektiği konusunda biraz fikirle kullanabilir)

Bir dal bir etiket değil (SVN bir olduğunu Revizyon Sistemi özelliği sürüm teklif etmeye çalışır : Bir etiketi anlamına gelmez bir dal olduğunu dallanma ve ucuz dosya kopyası ile dizinleri aracılığıyla etiketleme gibi ler)

Bir dal tanımlamak, aynı zamanda bir birleştirme iş akışını tanımlamak anlamına da gelir : işiniz bittiğinde şubenizi nerede birleştireceğinizi bilmeniz gerekir.
Bunun için, Practical Perforce'un (Laura WINGERD - O'Reilly) 7. bölümü, farklı dal türleri arasında iş akışını birleştirmek için iyi bir giriş (VCS agnostik): "" Yazılım Nasıl Gelişir "(pdf)

Kod hattı terimini tanımlar (kodun önemli evrim adımlarını, belirli noktalardaki etiketler aracılığıyla veya dala önemli birleştirme yoluyla kaydeden dal)

Ana hat modelini (sürümleri kaydetmek için merkezi bir kod hattı) sunar ve dallanma için çeşitli amaçları açıklar:

  • Aktif geliştirme akışları : sıralı çeşitli gelişmeler gerçekleştiğinde kalıcı bir kod hattı
  • görev dalları : daha özel görevler için kısa ömürlü dallar (hata düzeltme klasiktir, ancak tamamlaması karmaşık olduğunu bildiğiniz bir birleştirme çabası için bir dal da tanımlayabilirsiniz: bu görev dalında birleştirebilir, tamamlayabilir ve test edebilirsiniz mevcut ana geliştirme dalı için sorun çıkarmadan)
  • hazırlık dalı : üretim öncesi bazı özel veriler veya yapılandırma dosyalarıyla bir sürüm hazırlamak için.
  • Özel şubeler, geçici şubeler ve seyrek şubeler : çok küçük görevler için, resmi olarak tamamlanmasını veya test incelemesini beklemeden devam eden bazı işleri yapabilmek için.
    Bu, "erken taahhütte bulunmaya, sıklıkla taahhütte bulunmaya" izin verir.

VCS ile ilgili diğer ilginç kavramlar: Temel kavramlar
(orijinal olarak ClearCase hakkında, ancak herhangi bir VCS için de geçerlidir)


19

21. yüzyılın tüm SCM'leri size şunu söylüyor:

Bu yeni bir özellik, hata düzeltme, test, her ne olursa olsun, üzerinde çalışmanız gereken her görev için dallara ayırın. Buna konu dalı denir ve SCM'nizle çalışma şeklinizi değiştirir.

Sen alırsın:

  • Daha iyi izolasyon
  • Daha iyi izlenebilirlik -> görevleri tek tek değişiklik kümeleriyle değil, dallarla ilişkilendirirsiniz, bu da sizi istediğiniz kadar taahhütte bulunmanızı sağlar ve "görev başına bir kayıt" gibi bir sınır koymaz.
  • Görevler bağımsızdır (normalde kararlı bir temelden başlar, bu nedenle arkadaşlarınızdan gelen hataları düzeltmeye değil, yalnızca kodunuza odaklanırsınız) ve bunları bir noktada veya daha sonra entegre etmek isteyip istemediğinizi seçebilirsiniz, ancak her zaman sürüm kontrolü
  • Ana satıra geçmeden önce kodu kolayca gözden geçirebilirsiniz (sürüm kontrolünden, saçmalığa önceden değil)

Bunu yapabilen araçlar:

YAPAMAYACAK araçlar:

  • SVN
  • CVS
  • VSS
  • TFS
  • Performans

1
Bunu neden SVN ile yapamıyorsunuz?
yegor256

4
SVN iyi bir birleşme değil. Düzgün birleştirme izleme eksikliğinden dolayı. Bir de şube oluşturmak işaret ettiğim kadar ucuz olmadığı için gerçek şartlar altında kabusa dönüşüyor.
pablo

Daha iyi izlenebilirlik: Neden istediğiniz kadar çok taahhütte bulunmak isteyesiniz? Görev karmaşık bir özellik olmadığında görev başına bir kez yeterli değil mi? Ayrıca insanlardan gelen böcekler kolayca ana dala gidebilir ve birleştikleri anda onu "kararlı" ve "güvenli" olmayan hale getirebilirler.
Paiman Samadian

@PaimanSamadian: "Görev karmaşık bir özellik olmadığında görev başına bir kez yeterli değil mi?" Elbette. Görev Aynı şekilde, By olduğu karmaşık bir taahhüt değildir (işler iyi gidiyor eğer birkaç dakikada taahhüt) yeterli. Neden her görev için tek bir commit zorlansın? • "Ayrıca insanlardan gelen böcekler kolayca ana dala gidebilir" Aslında değil. Bir özellik dalı iş akışının amacının bir kısmı , kod ana dalla birleştirilmeden önce kod incelemesini ve testini mümkün kılmasıdır .
Marnen Laibow-Koser

1
@PaimanSamadian birden fazla iade, ara değişiklikleri açıklamak ve incelemeyi kolaylaştırmak için harika. Ayrıca, bir şey üzerinde birkaç saat çalışıyorsanız, birden çok iade harikadır.
pablo

8

Aynı zamanda kullandığınız SCM aracına da bağlıdır. Modern SCM'ler (git, mercurial, vb.), Gerektiğinde dalları oluşturmayı ve yok etmeyi giderek daha kolay hale getirir. Bu, örneğin üzerinde çalıştığınız hata başına bir dal oluşturmanıza olanak tanır. Sonuçlarınızı gövdede birleştirdikten sonra dalı atarsınız.

Diğer SCM'ler, örneğin yıkma ve CVS, çok daha "ağır" bir dallanma paradigmasına sahiptir. Bu, bir dalın yalnızca yirmi satırlık bir yamadan daha büyük bir şey için uygun olduğu anlamına gelir. Orada, şubeler klasik olarak, önceki veya gelecekteki bir ürün sürümü gibi tüm geliştirme yollarını izlemek için kullanılır.


5

Kod tabanınızda önemli ve / veya deneysel değişiklikler yapmanız gerektiğinde, özellikle de trunk'ı etkilemeden ara değişiklikler yapmak istiyorsanız.


5

Ne tür bir SCM kullandığınıza bağlıdır.

Daha yeni dağıtılmış sürümlerde (git ve mercurial gibi), her zaman dallar oluşturuyorsunuz ve yine de yeniden birleştiriyorsunuz. Biri ana hattaki yapıyı bozduğu için veya ağ çalışmadığı için sık sık ayrı bir dalda çalışırım ve daha sonra düzeltildiğinde değişiklikleri tekrar birleştiririm ve bunu yapmak o kadar kolaydır ki sinir bozucu bile değildir .

Dağıtılmış sistemlerde neler olduğunu anlamama en çok yardımcı olan belge (kısa ve okunabilir): UnderstandingMercurial .

Merkezi bir depoya sahip eski sistemlerde (CVS, SVN ve ClearCase gibi), ekip düzeyinde karar verilmesi gereken çok daha ciddi bir sorundur ve yanıt daha çok 'izin verirken eski bir sürümü korumak' şeklinde olmalıdır. ana hatta devam etmek için 'veya' büyük bir deneyin parçası olarak '.

Dağıtılmış model bence çok daha iyi ve baskın paradigma haline gelmek için sadece güzel grafik araçlardan yoksun. Bununla birlikte, yaygın olarak anlaşılmamıştır ve kavramlar farklıdır, bu nedenle yeni kullanıcılar için kafa karıştırıcı olabilir.


3

Perforce'dan Laura Wingerd ve Christopher Seiwald'ın tavsiyesinin gerçekten kısa ve faydalı olduğunu düşünüyorum:

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

Her birinin ayrıntılı açıklaması ve diğer en iyi uygulamalar için http://www.perforce.com/sites/default/files/pdf/perforce-best-practices.pdf adresine bakın .


3
P4 insanları bunu söylerdi, ancak günümüzde pazarlamaları farklı bir şey söylüyor. Yıllarca dallanmadan kaçınmaya çalıştılar, çünkü Git gibi diğer sistemler kadar iyi görev veya konu dalları yapamıyorlar
pablo

2015 yılında yanıt! Dallanmayı önlemenin nedeni, birleştirme ihtiyacından kaçınmaktır - Perforce'un görev / konu dalına sahip olmadığı için değil (akışlarda "görev dalı" yapabilirsiniz - Perforce'da buna "görev akışları" diyoruz. Diğerlerinin de bahsettiği gibi - Dallanma DVCS'de ima ediliyor ve soru saygısız hale geliyor. Tartışmanın yalnızca istemci-sunucu tarzında çalışan araçlarla sınırlı olması gerektiğini düşünüyorum. Veya merkezi bir şekilde kullanılan DVCS (2015.1 sürümünden beri Perforce'u bir DVCS modunda kullanabilirsiniz - her iki dünyanın en iyisi).
Lester Cheung

2

Dallanmanın çeşitli amaçları vardır:

  1. Özellik / hata dalları. Özellik / hata düzeltme tamamlandığında ana hatlara geri taşınan dinamik ve aktif dallar.
  2. Statik dallar (Subversion'daki etiketler, aslında sadece 'normal bir dal' olsa da). Örneğin bir sürümün statik bir anlık görüntüsünü sağlarlar. Onlar bile olabilir üzerinde çalışılacak, bunlar değiştirilmez.

1

Dallanma ihtiyacı da ortaya çıkabilir:

  • belirli bir müşteriye bir düzeltme sağlamak istediğinizde (önemli olduğunu söyleyin) ve düzeltmenin gelecekteki sürümlerin bir parçası olup olmayacağından emin değilseniz


  • 1

    Ne zaman istersen.

    Merkezileştirilmiş bir SCM ile çalışıyorsanız muhtemelen çok sık olmayacaksınız, çünkü şubeler resmi havuzun bir parçası ve bu, birleşmelerin gerçekten incittiğinden bahsetmeye bile gerek yok.

    OTOH, dağıtılmış SCM'lerde şube ve ödeme arasında teknik bir fark yoktur ve birleştirmeler çok daha kolaydır. Daha sık dallanmak isteyeceksiniz.


    0

    Geçerli şubenize bağlı olarak, o şubeden sonraki sürüm için değil (ve daha önce değil) değişiklik yapmanız gerektiğinde.

    Örneğin, genellikle bagaj üzerinde çalışıyoruz. Yayınlanma zamanı civarında, birisinin mevcut sürümde istemediğimiz bir değişikliği yapması gerekecek (bu değişiklik yayınlanmadan önce olabilir, şu anda genellikle yayınlandıktan sonradır). Bu, sürümü kendi dalına koymak ve gövde üzerindeki bir sonraki sürüm için geliştirmeye devam etmek için dallara ayrıldığımız zamandır.


    0

    Tüm teknik özellikleri bir kenara bırakırsak .....

    Tekrar birleştirmenin daha kolay olduğunu bildiğiniz zaman dal!

    Birleştirmenin her zaman bir projede işin nasıl yürütüldüğünden etkileneceğini unutmayın.

    Bu bir kez elde edildiğinde, diğer tüm üçüncül konular devreye girecektir.

    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.