Birden çok paralel yayın dalına sahip Git akışı ve ana


87

Git-flow tarafından uygulanan başarılı Git dallanma modelini benimsemeye çalışıyoruz . Şimdi, biri en son kararlı sürüm ve diğeri sonraki ("önizleme") sürüm için olmak üzere en az iki yayın dalı üzerinde çalışıyoruz. Anlamadığım şey, neden tüm sürümlerin ana bilgisayara "doğrusallaştırılmış" ve orada etiketlenmiş gibi göründüğü . Sürümleri neden sürüm dallarında etiketlemiyorsunuz? Neden usta ? Ya da neden bir geliştirme dalı ve bunun için master kullanmıyorsunuz ?

Yanıtlar:


77

Git-flow modelinde, "en son yayınlanan" sürümünüz ile eşlenirken master"önizleme sürümünüz" bir git-flow releasedalına eşlenir . Gerçek sürüm gerçekleştiğinde , çatallanır developve sonunda birleştirilir master. Daha sonra bu sizin "en son sürümünüz" olacak ve genellikle git-flow hotfixdallarını kullanarak bu sürüm için yalnızca hataları düzelteceksiniz . Bu şekilde, masterher zaman en son yayınlanan sürümünüzün en kararlı durumunu temsil eder.

Eski sürümler için hataları düzeltmek veya orada başka bir geliştirme yapmak istiyorsanız support, uygun commit'den bir dal çatallayacaksınız master( orada oluşturulmuş tüm sürümlere sahip olacaksınız ). supportşubeler hala deneyseldir ( belgelere göre ) ve iyi belgelenmemiştir. Ancak komut satırından da görebileceğiniz gibi yardım:

usage: git flow support [list] [-v]
       git flow support start [-F] <version> <base>

bu dallar yeni başlatılmıştır ve masterne de geri birleştirilmeleri amaçlanmamıştır develop. Bu genellikle iyidir, çünkü müşteriler tarafından "eski" sürümlerde uygulanması istenen "eski" sürümler veya özellikler için yapılan düzeltmeler geri dönülemez veya geri dönmemelidir master. Hala düşünüyorsanız, ana geliştirme hattınıza ( masterve ile gösterilen develop) bir düzeltme eklemek istiyorsanız , sadece bir başlayın hotfix, değişikliklerinizi seçin ve hotfix.


17
Bu, Testten QA'ya ve üretime kadar yavaş bir ardışık düzen ile uğraşmaz. Her biri o ardışık düzenin farklı bir aşamasında bulunan ve her biri testte bulunan hataların düzeltilmesine izin vermek için gereken iki (veya daha fazla, ancak şimdilik sadece iki diyelim) serbest bırakma dalı olabilir. Bu durumda geliştirme dalı, henüz şubesi yapılmamış bir sürüm için özelliklerin biriktirildiği yer olacaktır. Böyle bir durumda, n-2 sürümündeki bir düzeltme en sonunda geliştirmek için birleştirilecek, ancak en azından standart git akışını takiben n-1 sürümünü atlayacaktır. Bu, n-1'de bir gerilemeye yol açacak ve sonunda n
Brendan

Neden serbest bırakma dalları tutulmasın ve daha yeni bir sürüm dalı oluşturulduktan sonra, daha eski bir "destek" dalına dönüşür?
lkanab

1
Neden serbest bırakma dalları geliştirmeden "çatallanmış" ve yalnızca geliştirmeden "dallanmış" değil?
Sandra K

gitflow-avh , orijinal gitflow'un sürdürülen (yani ölü olmayan) bir çatalına benziyor. git flow supportdeneysel olarak işaretlenmemiş.
Timo Verhoeven

9

Dallara biraz fazla vurgu yapan çoğunlukla zihinsel bir modele benziyor. Kabul ediyorum, yayınladığınız taahhütleri ana olarak birleştirmek yerine etiketleyebilirsiniz.

Yine de resim güzel. Her şeyi ana olarak birleştirmek, sürüm etiketlerinin grafiğin her yerine dağılması yerine geçici sırayla sürümlerin açık bir göstergesini verir.

Yine de bu modelin eski sürümlerde hata giderme için çalışmadığını düşünüyorum. Düzenli siparişi bozuyor.

  1. 1.0.1 sürümünü yayınladığımızı ve daha sonra özellikler eklediğimizi ve 1.1.0'ı yayınladığımızı varsayalım.
  2. 1.0.1'de bir hata bulduk ve her iki sürümde de düzeltmek istiyoruz
  3. Master'da 1.1.0'dan sonra 1.0.2 eklemeliyiz ve ardından doğrudan 1.1.1'e atfedebiliriz (veya önce).

Sorunuzu cevaplamak için: Sanırım bu, bazı durumlarda basit bir zihinsel model oluşturan bir dizi kuraldır. Tüm kurallar tamamen teknik açıdan anlam ifade etmiyor ama bu onları kötü yapmıyor. Zihinsel modeller onlar için iyi olur.


1
supportşubeler eski sürümlerde hata düzeltmek için tasarlanmıştır, ancak yine de "deneysel" olarak etiketlenmiştir.
mstrap

2

Ben şahsen söz konusu git-akışının aşırı karmaşık olduğunu düşünüyorum.

GitHub kullanıyorsanız GitHub flow(Scott Chacon tarafından açıklandığı gibi) deneyin .

Özellikle birden çok özellik üzerinde işbirliği, kod incelemesi için kullanışlıdır ve bunu Commit Status API.

GÜNCELLEME : GitHub Flow ™ 'un yeni bir resmi web sitesi var

GÜNCELLEME 2 : GitHub Flow ™ için yeni bir resmi (ve basitleştirilmiş) GitHub Kılavuzu var: https://guides.github.com/introduction/flow/


10
GitHub akışı yalnızca yayın merkezli olmayan bir bağlam için uygundur: git-akış süreci büyük ölçüde "yayın" etrafında tasarlanmıştır. Gerçekten "yayınlamamız" yok çünkü her gün üretime dağıtıyoruz - genellikle günde birkaç kez.
Remi Mélisson

10
Ben de gerçekten bu harika çalışmadığını git-akışını eklersiniz içinde bakım bültenleri olan bir salım merkezli bağlamda. Örneğin, 1.3.0 sürümünden sonra 1.2.1 sürümü olduğunda ne olur? Muhtemelen master, eserin kronolojisinin bir anormalliği ile birleştirilemez .
Ken Williams

Açıklandığı gibi @KenWilliams mstrap cevabı , bu nedir supportdalları içindir. Ama haklısın, bu tür sürümlerin yeniden birleştirilmemesi gerçekten bir anormallik, ki bu da master- benim anlayışıma göre - tüm prodüksiyon sürümlerini içermeli.
beatngu13

2

Benim durumumda, aynı yazılımın temelleri aynı olan ancak her sürümün bazı farklı özellikleri olan iki sürümüne sahibim.

Bu yüzden iki tane oluşturuyorum worktree, bunun anlamı, ana birimin yanında iki ilgili uzun süreli dal oluşturmaktır.

$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master

O zaman bende:

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

Bir depo var ama yukarıdaki her dal için yan yana 3 ayrı klasörüm var. Ve ustada ortak değişiklikleri yapın. daha sonra diğer iki sürümle birleştirin.

cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here i get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here i get the basic.cpp latest changes for gold project

Her sürümün belirli değişiklikleri ilgili klasöre de gidecek ve her projedeki çalışmalar izole edilecek ve IDE'nin kafası karışmayacak.

Umarım yardımcı olur.


2

@Mot'a tamamen katılıyorum.

Aynı soruları duymak güzel.

Ekibimiz ayrıca Successfull modelinden daha fazla Evrensel dallanma modeli için avlandı . Örneğin yukarıda bahsedildiği gibi @Mot - ana fikir, ayrık * .git deposunda release- * dallarını desteklemek için fazladan depolardan kaçınmaktır, örneğin kararlı sürümler için kernel.org tarafından yapıldığı gibi. Ancak kernel.org bunu, indirilen boyutları en aza indirmek için yapıyor sanırım.

Bana göre , geliştirme için ana hat olarak ustaya sahip olmak daha temiz görünüyor .

Ayrıca bazı çakışma release- * modelini birleştirme için usta ve düşüncesi ile sonradan etiketleyerek

Ana üzerinde bir taahhüt olduğunda yazılımımızı otomatik olarak oluşturmak ve üretim sunucularımızda kullanıma sunmak için bir Git kanca komut dosyası kullanmak

neden bitirme (birleştirme ve etiketleme) atomik bir işlem değildir:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

ve git hook otomatik sürüm oluşturma desteği ile derlemeye başlarsa:

$git describe --tags --long >.ver

o zaman yanlış bir sürümün aşağıdakiler için oluşturulması mümkündür:

$ git merge --no-ff release-1.2

Successfull'da sürümlemenin bazı bump sürüm sürecini tanıttığını biliyorum, ancak bu otomatik değil.

Özetlemek gerekirse - sürümler için şube modeline sunduğumuz temel farklar - * birleştirme ve etiketleme: - Dalını oluşturmada sürümü etiketleme - gelecekte bunların bakımını sağlamak için sürümün dalını koruyun


-2

Ana şube HER ZAMAN üretim kod tabanınızı temsil etmelidir, bu nedenle her zaman bir üretim sürümünden hemen sonra kodu ana olarak birleştirirsiniz.

Etiketleme, bir üretim sürümüne giren tam kodu "ezberlemek" için kullanılır, böylece daha sonra geri dönebilir ve bir şeyler ters giderse kodu analiz edebilirsiniz.

Bu teorik olarak, kodunuzu ana dalda yeniden birleştirdikten sonra sürüm dalında veya ana dalda etiketlemeniz önemli olmamalıdır. Ben şahsen sürüm dalındaki kodu etiketlemeyi tercih ederim, çünkü bu tam olarak derleme / yayınlama işlemine giren koddur (birleştirme ile bir şeylerin ters gidebileceğini varsayarak).

Geliştirme şubesi konseptiyle ilgili sorun, tek iş parçacıklı olmasıdır. Bu başlıkta Brendan, bir geliştirme dalı konseptini içeren bir stratejiden bahsetti.


4
Paralel olarak v1.0, v1.1, v1.5 gibi birden çok sürüm tutuyorsanız "üretim kodu tabanı" nedir?
Thomas S.

Üretim Kodu Tabanı şu anda üretimde olan şeydir, örneğin v1.0. Dallar, gelecekte üretime dağıtılacak sürümler için değişiklikleri taşır, örneğin V1.0.1, v1.1 ve v2.0. Üretime "gelecekteki" bir sürüm dağıtıldığında, ana sürüm için yeniden birleştirilir, böylece ana sürüm, üretimde olanı yansıtır. Ayrıca ileriye doğru birleştirilir (örn. V1.0.1'den 1.1'e ve v2.0'a), böylece v1.1 üretime çıktığında v1.0.1 değişiklikleri kaybolmaz.
Bernie Lenz

4
Gelecekteki sürümler hakkında değil, birden çok yayımlanmış sürümü sürdürmekten bahsediyorum.
Thomas S.

4
Beni anlamıyor gibisin. Bazı şirketlerde birden fazla sürüm sürümünün korunduğunu hayal edemez misiniz? Örneğin Microsoft, Windows 7, 8, 8.1 ve 10 için de güncellemelere sahiptir, öyleyse neden diğer şirketler olmasın?
Thomas S.

1
Bu doğru Thomas. Bu model, web siteleri gibi belirli bir zamanda tek bir üretim sürümüne sahip ürünlere yöneliktir. Bu modeli, aynı sürüm numarasını kullanarak bir android veya iPhone yapısı (veya her ikisi) üretmek için yapının parametreleştirildiği android ve iPhone gibi mobil yapılar için de kullandım. Muhtemelen bazı bileşenlerin paylaşıldığı ve bazı bileşenlerin farklı olduğu herhangi bir zamanda üretimde birden fazla canlı versiyona sahip bir ürün için bir yapı modelinin nasıl yapılandırılacağına ilişkin girdilerinizi öğrenmeyi merak ediyorum. Lütfen bize bildirin ...
Bernie Lenz
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.