Küçük geliştirme ekibi için Git şube stratejisi [kapalı]


186

Neredeyse her gün güncellediğimiz ve yayınladığımız bir web uygulamamız var. Git'i VCS olarak kullanıyoruz ve mevcut dallanma stratejimiz çok basit ve kırılmış: bir ana dalımız var ve içinde 'iyi hissettiğimiz' değişiklikleri kontrol ediyoruz. Bu işe yarıyor, ancak biz sadece bir değişiklik kontrol edene kadar.

Herkes aşağıdaki gereksinimleri karşılayan küçük takımlar için favori bir git şube stratejisine sahip mi?

  1. 2 ila 3 geliştirici ekip için iyi çalışır
  2. Hafif ve çok fazla işlem yok
  3. Geliştiricilerin hata düzeltmeleri ve daha büyük özelliklerle çalışmayı kolayca izole etmesini sağlar
  4. İstikrarlı bir şube tutmamızı sağlar (üretim sunucularımızı çalıştırmak zorunda kaldığımız anlar için)

İdeal olarak, yeni bir hata üzerinde çalışan bir geliştirici için adım adım işleminizi görmek isterim

Yanıtlar:


247

Scott Chacon'un Pro Git'te tanımladığı iş akışından yararlanabilirsiniz . Bu iş akışında, daima var olan, ana ve geliştiren iki kolunuz vardır .

master , projenizin en kararlı versiyonunu temsil eder ve bu şubeden üretime sadece konuşlandırırsınız.

Geliştirme , devam etmekte olan ve üretime hazır olması gerekmeyen değişiklikler içerir.

Gönderen geliştirmek dalı, tek tek özellikler ve düzeltmelerle ilgili çalışmalarına konu dalları oluşturmak. Özelliğiniz / düzeltme gitmeye hazır hale geldiğinde içine birleştirme geliştirmek kez., Aynı tarihte İş arkadaşların birleştirildi ki diğer konu dalları nasıl etkileşimde test edebilirsiniz işaret geliştirmek , kararlı bir durumda olduğunu içine birleştirme usta . Ustadan üretime dağıtım her zaman güvenli olmalıdır .

Scott, bu uzun süredir devam eden dalları kodun "siloları" olarak tanımlıyor.

Bu model altındaki iş akışınız adım adım şöyle görünebilir:

  1. Bir hatayı düzeltmeniz gerekiyor.
  2. Bir şube denilen oluşturun myfix dayanmaktadır geliştirmek dalı.
  3. Düzeltilene kadar bu konu dalında hata üzerinde çalışın.
  4. Birleştirme myfix içine geliştirmek . Testleri çalıştırın.
  5. Başka bir konu şube ile düzeltme çatışmaları keşfetmek hisfix iş arkadaşlarınızın birleştirilecek olduğunu geliştirmek size düzeltme üzerinde çalışıyoruz iken.
  6. Bu çakışmalarla başa çıkmak için düzeltme dalında daha fazla değişiklik yapın .
  7. Birleştirme myfix içine geliştirmek tekrar çalıştırmak testler.
  8. Her şey yolunda gidiyor. Birleştirme geliştirmek içine ustası .
  9. İstikrarlı olduğunu bildiğiniz için her zaman master'dan üretime dağıtın .

Bu iş akışı hakkında daha fazla ayrıntı için Pro Git'teki Dallanma İş Akışları bölümüne bakın.


7
Ayrıca Scott Chacon, sitesinde Github'ın
program247365 29:11

71
Bence bu harika, eğer geliştirme dalından hata düzeltme dalları oluşturursanız, onu henüz master yapmadığınız ve henüz yayınlamadığınız "yeni" her şeyde birleştirmeden dağıtamazsınız. bu dalda belgeleme / veritabanı değişiklikleri veya yapılması zor başka bir şey olması durumunda gerçek bir acı olabilir. Acil "düzeltmeler" için bence, şube master yapmak gerekir.
Richard

5
F1'in bir haftada piyasaya sürüleceği ancak F1 ve F2'nin gelişiminin çakıştığı varsayılarak F2'nin 2 hafta içinde piyasaya sürüleceği 2 ayrı özellik geliştirirsek ne olur? Bununla ilgili herhangi bir öneriniz var mı?
Murat Derya Özen

4
developGit olmadığını bir soruna gereksiz 'çözüm' olduğunu. Bildiğim kadarıyla başarı hiçbir yorum izin verilen yanlış yönlendirilmiş bir makale iyi yazılmış olması nedeniyle. İşte bir karşı yazı barro.github.io/2016/02/…
Tim Abell

5
8. adımda, geliştirme kodunun bir kısmının üretime hazır olmayabileceği düşünüldüğünde, geliştirme dalını ana birime dönüştürmek kötü bir fikir gibi geliyor. Özellik dalını master ile birleştirmek daha iyi olmaz mıydı?
Todd

45

Daha önce hiç kaynak kontrolü kullanmayan diğer geliştiricilere öğretmek için basit bir strateji bulmaya çalışan bir acemi olarak geldikten sonra. Bu http://nvie.com/posts/a-successful-git-branching-model/ uygun adam olduğunu adam sayfalarında standart GIT iş akışını kullanmayı denedim ama biraz kafa karıştırdı ve izleyicilerim tamamen.

Geçtiğimiz 6 ay boyunca sadece iki kez çatışmaları düzeltmem gerekti. Birleştirme işleminden sonra her zaman test etmek ve özellikler geliştirirken (sabahları ve öğleden sonra bir kez) çok fazla 'getirip birleştirmek' veya 'çekmek - rebase' adımları ekledim. Ayrıca en son kodu çekmek için github.com'u merkezi bir yer olarak kullandık.


Bu mükemmel bir bağlantı! Bu iş akışı, bir seferde birden fazla sürümde her zaman uzaktan ve paralel olarak çalışan küçük ekibimiz için mükemmel bir şekilde çalışır. Çok iyi belgelenmiş. Teşekkürler Debriyaj!
keithxm23

Ah, işte bu bağlantıyı bulduğum yer :-) İlk Git projemi kurmadan önce birkaç Git stratejisine baktım (yıllar boyunca SCCS'den CVS'ye SVN'ye geçtim ve şimdi yeni bir proje için Git'i denemek istedim ) ve bu benim için en anlamlı olan buydu. Gönderinizi tanıyorum, bu yüzden bulduğum yer olduğundan eminim. Çok teşekkürler - harika çalışıyor!
Boise

4
Birisinin bu blog gönderisini aldığını gördüğümde biraz içeride ölüyorum. İşte bir çürütme: barro.github.io/2016/02/…
Tim Abell

Seninle aynı duyguyu paylaşıyorum @TimAbell; Ben default master branchen sık kullanılan DEĞİL zaman bu geliştirici olmak değil doğru hissediyorumA successful Git branching model
Nam G VU

35

(Benim Yapılan yorumunu Başlangıçta olması gerektiği gibi, o kendi cevap yukarıda.)

Github'dan Scott Chacon'dan:

Nasıl Yapıyoruz? GitHub Flow nedir?

  • Ana daldaki her şey konuşlandırılabilir
  • Yeni bir şey üzerinde çalışmak için, ana kopyadan tanımlayıcı olarak adlandırılmış bir dal oluşturun (ör: new-oauth2-scopes)
  • Bu şubeyi yerel olarak taahhüt edin ve çalışmanızı sunucudaki aynı adlı şubeye aktarın
  • Geri bildirim veya yardıma ihtiyacınız olduğunda veya şubenin birleştirilmeye hazır olduğunu düşünüyorsanız, bir çekme isteği açın
  • Birisi özelliği inceledikten ve oturumu kapattıktan sonra, onu master ile birleştirebilirsiniz
  • Birleştirildikten ve 'master'a itildikten sonra hemen dağıtabilirsiniz

Daha fazla ayrıntı için makalenin tamamına bakın: http://scottchacon.com/2011/08/31/github-flow.html

"Çekme istekleri" nin bir Github icadı olduğunu ve Git'in değil, web sitelerinde pişirildiği bir şey olduğunu unutmayın: https://help.github.com/articles/using-pull-requests/


4
Daha küçük bir ekip ve git konusunda daha az deneyimli geliştiricilerle bu iş akışının sadeliği kazanır. Farklı şekilde yaptığımız tek şey, özellik dalı ve master arasında, geliştiricilerin özelliği benzeri bir prodüksiyonda bu özelliği tamamlayabilmeleri için canlı bir KG sitesi görevi gören bir 'hazırlama' dalı olması.
Filolar

@Squadrons bunun için ahtapot konuşlandırmaya ihtiyaç duyuyor gibi geliyor , ok / reddetmek için inşa edilmiş kapılar farklı ortamlara giriyor ve kaynak kontrolünüzü bu tür şeylerle kirletmiyor.
Tim Abell

Master'dan özellik dalları oluşturmak ve daha sonra dağıtım için onları birleştirmek bir etiketiniz olduğu sürece güvenli bir geri alma noktası olduğu sürece sorun olmaz. Dağıtımlar her zaman plana göre yapılmaz. "Sadece ileriye doğru gitme" ye inanıp inanmamanız, para çekerken çok önemli değildir.
Razor

15

masterGeliştirme geliştirme dalı olarak dalı kullanın ve hata düzeltmeleri yapmak için sürüm dalları oluşturun.

Herhangi bir yeni özellik mastergeliştirme penceresi boyunca devam edecektir (doğrudan veya çekme istekleri olan konu dalları olarak size - grafikte gösterilmemiştir). Planlanan tüm özellikleriniz uygulandıktan sonra, özellik dondurmaya girin ve test yapın. Mutlu olduğunuzda, sürümü masterolarak etiketleyin v1.0.

Zaman içinde kullanıcılarınız hataları bulacaktır, v1.0böylece bu etiketten bir şube oluşturmak (örneğin, yayınlandıktan sonra adlandırın 1.0) ve daldaki bu hataları düzeltmek istersiniz . Yeni bir sürüm gerektirdiğini düşündüğünüz kadar hata düzeltildiğinde, onu şu şekilde etiketleyin v1.0.1ve tekrar birleştirin master.

Bu arada, masterdalda sonunda olarak etiketlenecek yeni bir geliştirme penceresi olabilir v1.1.

Durulayın ve tekrarlayın.

Semantik Sürüm numaralandırma mantığını izler .

 ---------(v1.0)--------------------------------(v1.1)-----------------------------> master
             \                                     \  
              ---(v1.0.1)---(v1.0.2)---> 1.0        ---(v1.1.1)---(v1.1.2)---> 1.1

5
1.0.1Değişikliklerinizi tekrar birleştirmeyi unutmayınmaster
kwahn

Ve 1.1birleştirme işleminden sonra her zaman efendi üzerinde yeniden 1.0.1pazarlamayı unutmayın - bu, karışıklığı en aza indirmeye yardımcı olur.
Nam G VU

@NGGVU Bunu tavsiye etmem. 1.1bir yayın dalıdır ve bir veya daha fazla sürümün tam durumunu temsil eden etiketlere sahiptir. O dalı yeniden oluşturmak, bu temsili kaybetmenize neden olur. Bunu önlemek için serbest bırakma dallarınızı zorla itmeleri engelleyecek şekilde ayarlamanızı şiddetle tavsiye ederim.
Leif Gruenwoldt

1
Hayır. Serbest bırakma dallarını efendide birleştirme! İhtiyacınız olmayan her türlü baş ağrısını verebilir (sadece serbest bırakılan şeylerde birleşmek, yeni sürümlerle çatışmaları birleştirmek, yapıları kırmak, lineer olmayan tarih, vb.) . Bunun yerine, sürümleri çatal olarak kabul edin. Bkz. Bitsnbites.eu/a-stable-mainline-branching-model-for-git
m-bitsnbites

4
cherry-pick, master'a sürüm değişikliklerini almak için daha iyi bir seçenektir
BartoszKP

4

Bir VCS'de, sadece bir "ana" şubeye sahip olmak, sınırlarını hızlı bir şekilde gösterir, çünkü tüm geliştirme çabalarını aynı anda bir dalda sürdüremezsiniz.
Bu, ne zaman dallanacağınızı bilmeniz gerektiği anlamına gelir .

Ancak bir DVCS'de ("Merkezi Olmayan" VCS'de olduğu gibi) bir yayın sorununuz da var yerel tuttuğunuz şubeler ve ittiğiniz veya çektiğiniz şubelerle .

Bu bağlamda, eşzamanlı geliştirme çabanızı belirleyerek işe başlayın ve bir yayın (it / çek) sürecine karar verin. Örneğin (ve bu tek yol değildir):

  • prod, üretim kodu olan salt okunur bir kamu dalıdır. Herkes şunları yapmak için çekebilir:
    • mevcut gelişimini bunun üzerine yeniden yapılandırın (yerel testler için veya yerel geliştirme deposuna entegre olmak için, ürün dalı üzerindeki eşya deposunda yapılan bir düzeltme)
    • yeni özellikler yapmak için şube (bilinen bir kararlı koddan)
    • Bir sonraki serbest bırakma dalını (üretimde olacak olan) başlatmak için şube
      hiç kimse doğrudan prod'a itmemelidir (bu nedenle salt okunur)
  • serbest bırakma bir okuma-yazma konsolidasyon dalıdır, burada ilgili taahhütler bir sonraki serbest bırakmanın bir parçası olarak kiraz olarak seçilir.
    Herkes bir sonraki sürümü güncellemek için serbest bırakmaya itebilir.
    Herkes yerel konsolidasyon sürecini güncellemek için bu sürümden çekilebilir.
  • FeatureX, özel bir okuma-yazma dalıdır (merkezi ürün deposuna aktarılması gerekmez) ve geliştirici depoları arasında itilebilir / çekilebilir. Günlük geliştirmeden farklı olarak orta ve uzun vadeli çabaları temsil eder.
  • master geçerli geliştiriciyi temsil eder ve geliştirici depoları arasında itilir / çekilir.

Bu SO sorusunun kanıtladığı gibi diğer sürüm yönetimi süreçleri mevcuttur .


3

ReinH'nin Agile ekipleri için Git İş Akışı'nı buradan okuyun: http://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html

Bu, küçük ekipler için çok iyi çalışıyor. Buradaki amaç, potansiyel olarak dengesiz olabilecek her şeyin bir tür şubeye girmesini sağlamaktır. Ana öğeye yalnızca özellik dalının dışında çalışan herkesin onu kullanmaya hazır olduğu zaman birleşin.

Not: bu strateji git'e özgü değildir, ancak git bu stratejiyi uygulamayı oldukça kolaylaştırır.

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.