Uzun süredir yayınlanmamış kod için Git dallanma stratejisi


15

Ekibimizde, bireysel çalışma birimlerine (Hikayeler) ek olarak, daha uzun süren çalışma temalarımız var (Destanlar). Birden fazla hikaye destansı.

Geleneksel olarak, her bir Öykü için özellik dallarımız vardı ve bunları KG'yi geçtiklerinde ustalıkla birleştirmek için birleştirdik. Ancak, Epic "özellik tamamlandı" sayılana kadar, bir Epic'te tamamlanmış hikayelerin yayınlanmasına devam etmek istiyoruz. Bu özellikleri yalnızca tüm Epic kapalıyken üretime sunacağız. Ayrıca, her gece oluşturulmuş bir sunucumuz var - tüm kapalı Hikayelerin (tamamlanmamış Destanların bir parçası olanlar dahil) bu gece sunucusuna otomatik olarak dağıtılmasını istiyoruz.

Bunu başarmak için depomuzu nasıl yöneteceğimize dair herhangi bir öneriniz var mı? Doğrudan epik dal yerine ilgili epik dal ile kapalı hikayeleri birleştirdiğimiz "epik dalları" tanıtmayı düşündüm, ama endişelerim şöyle:

  • Destansı şubeler uzun süre açık tutulursa ortaya çıkabilecek birleşme çatışmalarından endişe ediyorum
  • Gece yapıları, tüm destansı dalları bir "gece yapısı" dalına birleştirmeyi gerektirir. Yine, birleşme çatışmaları ortaya çıkabilir ve bu otomatik olarak yapılacaktır

Yanıtlar:


24

Basit bir öneri: bunu yapma.

git dalları, burada tartışıldığı gibi ve https://blog.newrelic.com/2012/11/14/long-running-branches-considered-harmful/ kodunun uzun süre çalışan çatalları için değildir . Dallar en iyi şekilde, bireysel bir geliştirici tarafından günlük düzeyde taahhütleri düzenlemek için kullanılan geçici şeyler olarak ele alınır. Dolayısıyla, bir proje yöneticisine (son kullanıcı olsun) yanlış bir şey yaptığınızı umursadıkları bir şeye karşılık gelen bir isimleri varsa.

Önerilen uygulama, aşağıdakileri sağlamak için özellik geçişleri veya soyutlama ile sürekli entegrasyon kullanmaktır :

  • tüm kodlar her zaman entegre edilir (en azından her gün, tercihen daha sık)
  • Ne olur konuşlanmış açık kontrolü altındadır.

1
Bunun popüler bir cevap olabileceğinden şüphelendim! Bununla ilgili temel endişelerim, hem 'canlı' hem de 'sonraki' uygulamayı her zaman sürdürme yüküdür ve ayrıca bir özellik üzerinde çalışan geliştiricinin, yükseltmek (/ değiştirmek) yerine yeni paralel özellikler olarak değişiklikler oluşturmayı önceden bilmesini gerektirir. mevcut işlevsellik. Sanırım takımda daha büyük bir zihniyet değişikliği gerektiriyor.
Sitati

Kod geliştirmek için dalları kullanmakta sorun yoktur , sadece kod depolamak için onları kullanmayın . Dolayısıyla, bir görevin 30 dakikalık bir düzeltme mi yoksa 2 haftalık bir yeniden çalışma mı olduğundan emin değilseniz, bir şubeye başlayın. Bildiğiniz anda, bir soyutlama / geçiş için birleştirin veya yeniden düzenleyin ve birleştirin.
soru

@Sitati: Son dört aydır bir özellik dalında olan bazı kodları birleştirdim. Bu arada develAutotools'tan CMake'e geçtik, Travis CI'yi tanıttık, kodu yeniden düzenledik . Sonunda, yeni özelliği anlamak ve develbirleştirmek yerine manuel olarak uygulamak daha kolaydı . Ayrıca yeni yüksek lisans öğrencileri, tezlerine başladıklarında dalladıkları bir dalda yeni bir özellik geliştirdiler. Bir yıl sonra ittiler ve birleştirilmesi için hiçbir çaba yoktu, bu yüzden günden güne birleşmek zorlaştı.
Martin Ueding

2
Bağlantılı blog yazısı şu anda 5 yaşında. Özellik geçişlerinden nefret ediyorum. Uzun vadede dallanma, düzenli olarak ana özellik dalında bir araya gelme ve uzun vadeli özellik dalına sürekli entegrasyon ekleme ile ilgili sorun nedir?
Jason Kelley

CI, bir aracın değil, bir sürecin adıdır. Birden fazla özellik dalınız varsa, normal olarak birbirleriyle sürekli olarak entegre olmazlar. Bu, sorunları daha erken değil, daha sonra bulmak anlamına gelir.
soru

1

Bu oldukça yaygın bir sorun olduğunu düşünüyorum ve özellikler daha önce değil kodlandıktan sonra bir sürüme dahil edilecek özellikleri seçmek için kaynar.

Örneğin.

Ürünümün v2'si için A, B ve C özelliklerine sahibim. B ve C ilişkilidir, C de bitmedikçe B'yi bırakmak istemiyorum.

Tüm özellikler üzerinde aynı anda çalışan üç geliştiricim var.

Taş çıkış tarihi D'de bir setim var

B bitti ve birleştirildi, A bitti ve birleştirildi. C ertelendi ... ne yapmalıyım ?!

Bu sorunun teknik bir çözümü olduğuna inanmıyorum. Ürünün test edilmemiş bir sürümünü yalnızca A özelliği dahil olmak üzere serbest bırakmak istiyorsunuz. Mümkün olan tüm özellik kombinasyonlarını birleştirip test etmedikçe, bu her zaman bir olasılık olacaktır.

Çözüm daha insani bir çözümdür. Çıkış tarihinizi kaçırdınız ve geri itmeniz gerekiyor.


1

Bu zor bir sorun ama birçok insanın karşılaştığı bir problem. Gitflow kurulumunu başlangıç ​​noktası olarak kullanmayı tercih ederim.

Geliştirme ->
Master üzerinde çalışılan yeni şeyler -> Teste ihtiyaç duyan bitmiş ürünler Üretim -> Üretime yayınlanmış olan şeyler.

Küçük (daha kısa) özelliklerde, geliştirmeden bir dal yaratırım, oradaki işi yapar, sonra da dalı gelişime geri birleştiririm.

Başlıca (uzun vadeli) özelliklerde gelişimden bir dal oluşturur, o daldan daha küçük dallar oluşturur, sonra ilk dalla birleşirim. Başlıca özellik tamamlandıktan sonra geliştirme dalına geri döner.

Düzenli aralıklarla (projeye bağlı olarak) gelişimi tekrar master ile birleştiriyorum ve bir test döngüsü başlıyor. Testte herhangi bir düzeltme ortaya çıkarsa, ana dalda yapılırlar (alt dal sonra birleştirilir). Ve test sırasında ana dalda geliştirme devam edebilir.

Herhangi bir zamanda usta gelişimle birleştirilmeli ve kalkınma uzun vadeli alt dallarından herhangi biriyle birleştirilmelidir.

usta her zaman (teoride) üretime hazır olmalıdır. Kalkınma her zaman (teoride) üretime hazır olmalıdır. Test etmenin test etmesi için sağlam bir özellik kümesi sağlamanın tek nedeni budur.

Hazır olduğunda, test edilen bir master taahhüdü üretimle birleştirilir ve üretimde dağıtım bu branştan gerçekleşir. Acil bir durumda yapılması gereken HOTFIX'ler, Master'da birleştirilmeye gerek kalmadan Üretim branşında gerçekleşebilir (test edilmemiş birçok değişiklik olabilir).

Normal Ağacım benziyor

 LongTerm -> Development -> Master -> Production    
 LongTerm <- Development      |            |  
     |       Development -> Master         |  
 LongTerm <- Development -> Master         |  
             Development <- Master         |  
                            Master -> Production  

Genel kuralım, hiçbir değişikliğin birkaç saatten fazla sürmemesi gerekir. Eğer öyleyse, daha küçük değişikliklere yapılması gerekir. Büyük bir özellikse (UI yeniden yazma gibi), uzun vadede devam eder, böylece normal gelişim aynı anda devam edebilir. LongTerm şubeleri normalde sadece yerel şubeler, Geliştirme, Master ve Üretim ise uzak şubelerdir. Alt dallar da yalnızca yereldir. Bu, uzun vadeli özellik kümesinde git'in kullanışlılığını kaybetmeden depoyu başkaları için temiz tutar.

Bununla birlikte, uzun vadeli bir şubenin varlığının nadir bir şey olduğunu belirtmek isterim. Normalde tüm işlerim geliştiriliyor. Sadece normal geliştirici şeyler üzerinde çalışabilmem gereken kadar uzun sürecek bir özellik (set) olduğunda, LongTerm dalını kullanırım. Eğer birlikte olması gereken bir takım değişiklikler varsa, o zaman hepsi bitene kadar ustalaşmak için birleşmem.


"Başlıca (uzun vadeli) özelliklerde gelişimden bir dal oluştururum" - Üretim branşından yeni bir özellik (geliştirme) dalları oluşturmamalısınız? Üretim dalı olarak görmek, yayına hazır koddur.
robotron

Hayır, üretim zaten serbest bırakıldı, master üretimden önce ve geliştirme masterdan önce. Zaten siparişleri olan kod üzerinde çalışmıyorsanız sipariş toplamlarına vergi eklemek gibi yeni bir özellik anlamsızdır.
coteyr

Ancak dev'den ve daha sonra birleşmeden ayrılırsanız, bu dal (ve daha sonra master ve daha sonra Üretim) dallanma noktasına kadar başkaları tarafından yapılan tüm dev değişikliklerini dahil etmeyecek mi? Bu değişikliklerin bazılarının KG onayı olmayabilir. Belki de serbest bırakma yönetimine farklı yaklaşımlardan bahsediyordu.
robotron

Evet olacak, mesele bu. QA master'da belirli bir SHA üzerinde test eder, ancak bunun için geliştiriciyi kaldıramazsınız.
coteyr

"Master'da belirli bir SHA üzerinde KG testleri" -> KG, her yeni özelliği bağımsız olarak test eder mi? Sizin tarafınızdan, ekibimin karşılaştığı tipik bir senaryoyu yönetmeme izin verin: Aynı kod tabanında 2 uzun süredir devam eden projeniz olduğunu varsayalım: Proje A, geçen ay KG için ve başka bir ay için KG olacak. B Projesi son 6 aydır geliştiriliyordu ve şimdi KG için hazır. Proje A, master ile birleştirildi ve çok sayıda ince iş kuralı hatası nedeniyle kesinlikle üretime hazır değil. Proje B'yi nasıl ele alacağız? Etkileşim olup olmadığını kontrol etmek için A ve B birlikte test edilmelidir (B birleştirme sırasında çakışmalara neden olmaz).
robotron
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.