कई समानांतर रिलीज शाखाओं के साथ गिट-फ्लो और मास्टर


86

हम git-flow द्वारा कार्यान्वित सफल Git ब्रांचिंग मॉडल को अपनाने की कोशिश कर रहे हैं । अब, हम कम से कम दो रिलीज़-शाखाओं पर काम कर रहे हैं, एक नवीनतम स्थिर रिलीज़ के लिए और दूसरा अगले ("पूर्वावलोकन") रिलीज़ के लिए। मुझे समझ में नहीं आता है कि सभी रिलीज मास्टर को "रैखिककृत" क्यों लगती हैं और वहां टैग किया गया है। उनकी रिलीज़ शाखाओं में रिलीज़ को टैग क्यों नहीं किया गया? गुरु आखिर क्यों ? या क्यों एक विकसित शाखा और इसके लिए मास्टर का उपयोग न करें ?

जवाबों:


77

Git-flow मॉडल में, आपका "नवीनतम रिलीज़ किया गया" संस्करण वास्तव में मैप करता है master, जबकि आपका "प्रीव्यू रिलीज़" मैप्स एक git-flow releaseशाखा में। यह से उतारा जाता है developऔर अंत में विलय हो जाता है masterजब वास्तविक रिलीज होती है। फिर यह आपकी "नवीनतम रिलीज़" बन जाएगी और आप आमतौर पर उस रिलीज़ के लिए केवल बग्स को ठीक करेंगे, जिसमें गिट-फ्लो hotfixशाखाओं का उपयोग किया जाएगा । इस तरह, आपका masterहमेशा आपके नवीनतम रिलीज़ किए गए संस्करण की सबसे स्थिर स्थिति का प्रतिनिधित्व करता है।

यदि आप पुराने रिलीज के लिए बग्स को ठीक करना चाहते हैं या वहां कोई अन्य विकास करना चाहते हैं, तो आप supportउपयुक्त कमिटमेंट से एक शाखा निकालेंगे master(आपके पास वहां बनाए गए सभी संस्करण होंगे )। supportशाखाएँ अभी भी प्रयोगात्मक हैं ( डॉक्स के अनुसार ) और अच्छी तरह से प्रलेखित नहीं हैं। लेकिन जैसा कि आप कमांड लाइन की मदद से देख सकते हैं:

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

इन शाखाओं को अभी शुरू नहीं किया गया है और masterन ही वापस मर्ज किए जाने का इरादा है develop। यह आमतौर पर ठीक है, क्योंकि "प्राचीन" रिलीज या ग्राहकों द्वारा "प्राचीन" रिलीज में लागू किए जाने वाले अनुरोधों को ठीक किया जा सकता है या वापस नहीं जाना चाहिए master। यदि आप अब भी लगता है, आप बंदरगाह के लिए अपने मुख्य विकास लाइन (द्वारा प्रतिनिधित्व करने के लिए एक ठीक चाहते हैं masterऔर develop), बस एक शुरू hotfix, अपने परिवर्तन चेरी लेने और खत्म hotfix


17
यह टेस्ट से लेकर क्यूए से उत्पादन तक की धीमी पाइपलाइन से निपटता नहीं है। दो (या इससे भी अधिक हो सकते हैं, लेकिन चलो अभी के लिए दो कहते हैं) रिलीज शाखाएं खोलें, प्रत्येक उस पाइपलाइन के एक अलग चरण में हैं और प्रत्येक को परीक्षण में पाए जाने वाले कीड़े के लिए फिक्स की अनुमति देने की आवश्यकता है। विकसित शाखा तो हो जहां सुविधाओं एक रिलीज जिसका शाखा अभी तक नहीं किया गया है के लिए जमा किया जा रहा था होता। ऐसी स्थिति में, रिलीज़ n-2 पर एक फिक्स अंततः विकसित होने के लिए विलय कर दिया जाएगा, लेकिन कम से कम मानक git प्रवाह के बाद, n-1 को छोड़ना होगा। यह n-1 पर एक प्रतिगमन की ओर ले जाता है, अंततः n
ब्रेंडन

रिलीज की शाखाएं क्यों नहीं रखी जाएंगी और एक बार नई रिलीज शाखा बनाए जाने के बाद, पुरानी एक "समर्थन" शाखा में विकसित होती है?
लंकाब

1
क्यों रिलीज शाखाएं विकसित होने से "कांटे" हैं और विकास से सिर्फ "ब्रांचेड" नहीं हैं?
सांड्रा के

gitflow-avh मूल gitflow के एक अनुरक्षित (अर्थात मृत नहीं) की तरह दिखता है। git flow supportप्रयोगात्मक चिह्नित नहीं है।
तिमो वेरोहेन

9

शाखाओं पर बहुत अधिक जोर देने के साथ ज्यादातर एक मानसिक मॉडल की तरह दिखता है। मैं मानता हूं, आप केवल उन कमिटों को टैग कर सकते हैं जो उन्हें वापस मास्टर में विलय करने के बजाय जारी करते हैं।

तस्वीर बहुत सुंदर है, हालांकि। सभी चीज़ों को मास्टर में वापस मर्ज करने से संस्करण के टैग के बजाय अस्थायी ग्राफ़ में रिलीज़ होने का स्पष्ट संकेत मिलता है।

मुझे लगता है कि यह मॉडल पुराने रिलीज में बगफिक्सिंग के लिए काम नहीं करता है, हालांकि। यह साफ-सुथरा ऑर्डर देने में गड़बड़ी करता है।

  1. मान लें कि हमने संस्करण 1.0.1 जारी किया है और बाद में सुविधाओं को जोड़ा और 1.1.0 जारी किया।
  2. हम 1.0.1 में एक बग खोजते हैं और इसे दोनों संस्करण में ठीक करना चाहते हैं
  3. हमें मास्टर में १.१.० के बाद १.०.२ जोड़ना है और फिर सीधे (या उससे पहले) भी १.१.१ है।

आपके प्रश्न का उत्तर देने के लिए: मुझे लगता है कि यह नियमों का एक समूह है जो कुछ मामलों में एक साधारण मानसिक मॉडल के लिए बनाता है। सभी नियम विशुद्ध तकनीकी दृष्टिकोण से समझ में नहीं आते हैं, लेकिन यह उन्हें बुरा नहीं बनाता है। मानसिक मॉडल 'उन्हें इंसानों के लिए अच्छा है।


1
supportशाखाओं को पुराने रिलीज में बग-फिक्सिंग के लिए डिज़ाइन किया गया है, हालांकि अभी भी 'प्रयोगात्मक' के रूप में लेबल किया गया है।
mstrap

2

मुझे व्यक्तिगत रूप से लगता है कि उल्लिखित गिट-फ्लो ओवरक्लम्पलेटेड है।

यदि आप GitHub का उपयोग कर रहे हैं GitHub flow(जैसा कि स्कॉट चाकोन द्वारा वर्णित है)।

यह कई विशेषताओं, कोड-समीक्षा पर सहयोग के लिए विशेष रूप से उपयोगी है और आप इसका उपयोग करके अपने निरंतर एकीकरण समाधान के साथ जोड़ सकते हैं Commit Status API

अद्यतन : GitHub Flow ™ की एक नई आधिकारिक वेबसाइट है

अद्यतन 2 : GitHub Flow ™ के लिए एक नया आधिकारिक (और सरलीकृत) GitHub गाइड है: https://guides.github.com/introduction/flow/


10
GitHub प्रवाह केवल गैर-रिलीज़-केंद्रित संदर्भ के लिए उपयुक्त है: गिट-फ़्लो प्रक्रिया को "रिलीज़" के आसपास बड़े पैमाने पर डिज़ाइन किया गया है। हमारे पास वास्तव में "रिलीज़" नहीं है क्योंकि हम हर दिन उत्पादन के लिए तैनात करते हैं - अक्सर एक दिन में कई बार।
रेमी मेएलिसन

10
मैं यह भी कहना चाहूंगा कि गिट-फ्लो वास्तव में उस महान -रिलीज़-केंद्रित संदर्भ में काम नहीं करता है जिसमें रखरखाव रिलीज़ होता है। उदाहरण के लिए, 1.3.0 रिलीज़ के बाद 1.2.1 रिलीज़ होने पर क्या होता है? यह संभवतः masterकार्य के कालक्रम के एक विसंगति में विलय नहीं किया जा सकता है ।
केन विलियम्स

@KenWilliams जैसा कि mstrap के उत्तर में वर्णित है , यह वही है जो supportशाखाएं हैं। लेकिन आप सही हैं, यह वास्तव में एक विसंगति है कि इस तरह के रिलीज को वापस मर्ज नहीं किया जाता है master, जो कि मेरी समझ में है - सभी उत्पादन रिलीज को रोकना चाहिए।
बीटंगू १३

2

मेरे मामले में, मेरे पास एक ही सॉफ्टवेयर के दो संस्करण हैं जो मूल बातें समान हैं लेकिन प्रत्येक संस्करण में कुछ अलग विशेषताएं हैं।

तो मैं दो worktreeका अर्थ है कि गुरु के पास दो प्रासंगिक लंबे समय से चल रही शाखाओं का निर्माण।

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

फिर मेरे पास है:

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

एक रिपॉजिटरी है, लेकिन मेरे पास ऊपर की प्रत्येक शाखा के लिए एक दूसरे के पास 3 अलग-अलग फ़ोल्डर हैं। और मास्टर में आम बदलाव करें। फिर इसे दोनों अन्य संस्करणों के साथ मर्ज करें।

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

प्रत्येक संस्करण के विशिष्ट परिवर्तन इसी फ़ोल्डर में भी जाएंगे, और प्रत्येक परियोजना पर काम अलग-थलग हैं और आईडीई भ्रमित नहीं होगा।

उम्मीद है की वो मदद करदे।


2

@Mot से पूरी तरह सहमत हैं।

वही सवाल सुनकर अच्छा लगा।

हमारी टीम भी की तुलना में अधिक यूनिवर्सल शाखाओं में मॉडल के लिए शिकार किया गया था सफल नहीं। Ie @Mot जैसा कि ऊपर उल्लेख किया गया है - मुख्य विचार रिलीज को सपोर्ट करने के लिए अतिरिक्त रिपॉजिटरी शुरू करने से बचना है- * अलग-अलग *। शाखाओं में। यह स्थिर उदाहरण के लिए kernel.org द्वारा किया जाता है। लेकिन कर्नेल.ऑर्ग मुझे लगता है कि डाउनलोड किए गए आकारों को न्यूनतम करने के लिए करता है।

मेरे लिए ऐसा लगता है कि विकास के लिए मेनलाइन के रूप में मास्टर होना अधिक साफ है ।

रिलीज में कुछ संघर्ष भी हैं- * मॉडल को मास्टर करने के लिए विलय करना और बाद में विचार के साथ टैग करना

स्वचालित रूप से हमारे उत्पादन सर्वर पर हमारे सॉफ़्टवेयर को बनाने और रोल-आउट करने के लिए एक Git हुक स्क्रिप्ट का उपयोग करें, हर बार मास्टर पर एक कमिट था

कारण परिष्करण (विलय और टैगिंग) एक परमाणु लेनदेन नहीं है:

$ 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

और अगर git हुक का निर्माण ऑटोमैटिक वर्जनिंग सपोर्ट के साथ होता है:

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

तब एक गलत संस्करण के लिए बनाया जाना संभव है:

$ git merge --no-ff release-1.2

मुझे पता है कि सक्सेसफुल में संस्करण कुछ बम्प-संस्करण प्रक्रिया का परिचय देता है, लेकिन यह स्वचालित नहीं है।

तो राशि के लिए - हम रिलीज के लिए शाखा मॉडल से जुड़े महत्वपूर्ण अंतर- * विलय और टैगिंग कर रहे हैं: - इसकी शाखा बनाने पर रिलीज को टैग करना - भविष्य में उन्हें बनाए रखने में सक्षम करने के लिए रिलीज की शाखा रखें


-2

मास्टर ब्रांच को हमेशा आपके प्रोडक्शन कोड बेस का प्रतिनिधित्व करना चाहिए, इसलिए आप हमेशा प्रोडक्शन रिलीज़ होने के बाद कोड को वापस मास्टर में मर्ज कर देते हैं।

टैगिंग का उपयोग सटीक कोड को "याद" करने के लिए किया जाता है जो एक उत्पादन रिलीज में चला गया ताकि आप बाद में वापस जा सकें और कुछ गलत होने पर कोड का विश्लेषण कर सकें।

सैद्धांतिक रूप से इस बात से कोई फर्क नहीं पड़ता कि आप अपने कोड को रिलीज़ शाखा पर या मास्टर शाखा में टैग करने के बाद वापस मास्टर में विलय कर देते हैं। मैं व्यक्तिगत रूप से रिलीज़ शाखा पर कोड को टैग करना पसंद करता हूं क्योंकि यह बिलकुल ऐसा कोड है जो बिल्ड / रिलीज़ में चला गया (यह मानते हुए कि मर्ज के साथ कुछ गलत हो सकता है)।

विकास शाखा अवधारणा के साथ मुद्दा यह है कि यह एकल पिरोया हुआ है। इस सूत्र में ब्रेंडन ने एक रणनीति का उल्लेख किया, जिसका उपयोग विकास शाखा की अवधारणा को शामिल करने के लिए किया जा सकता है।


4
यदि आप समानांतर में v1.0, v1.1, v1.5 जैसे कई रिलीज बनाए रखते हैं, तो "प्रोडक्शन कोड बेस" क्या है?
थॉमस एस।

उत्पादन कोड बेस है जो अभी उत्पादन में है जैसे कि v1.0। भविष्य में V1.0.1, v1.1 और v2.0 जैसे उत्पादन के लिए तैनात की जाने वाली रिलीज़ के लिए शाखाएँ परिवर्तन करती हैं। एक बार "भविष्य" जारी करने के बाद इसे मास्टर में वापस मर्ज कर दिया जाता है, ताकि मास्टर को यह पता चले कि उत्पादन में क्या है। यह भी आगे विलय कर दिया जाता है (जैसे v1.0.1 से 1.1 और v2.0) ताकि v1.1 उत्पादन में जारी होने पर v1.0.1 परिवर्तन खो न जाए।
बर्नी लेनज़

4
मैं कई जारी किए गए संस्करणों को बनाए रखने के बारे में बात कर रहा हूं, भविष्य के संस्करणों के बारे में नहीं।
थॉमस एस।

4
तुम मुझे समझने के लिए नहीं लग रहे हो। क्या आप कल्पना नहीं कर सकते कि कुछ कंपनियों में कई रिलीज़ संस्करण बनाए हुए हैं? उदाहरण के लिए, Microsoft विंडोज 7, 8, 8.1 और 10 के लिए भी अपडेट रखता है, तो अन्य कंपनियां क्यों नहीं?
थॉमस एस।

1
यह सही है थॉमस। यह मॉडल उन उत्पादों की ओर अग्रसर होता है, जो किसी दिए गए बिंदु पर एकल उत्पादन रिलीज़ करते हैं, जैसे कि वेब साइट्स। मैंने इस मॉडल का उपयोग मोबाइल बिल्ड जैसे एंड्रॉइड और आईफोन के लिए भी किया है, जहां बिल्ड को एक ही संस्करण संख्या का उपयोग करके या तो एंड्रॉइड या आईफोन बिल्ड (या दोनों) का उत्पादन करने के लिए मानकीकृत किया गया है। मैं आपके इनपुट के बारे में जानने के लिए उत्सुक हूं कि किसी उत्पाद के लिए एक बिल्ड मॉडल कैसे तैयार किया जाए, जिसके उत्पादन में कई लाइव संस्करण हैं जो संभवत: कुछ घटकों के साथ साझा किए गए हैं और कुछ घटक अलग-अलग हैं। कृपया हमें बताएं ...
बर्नी लेन्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.