"विकसित" शाखा की प्रवृत्ति दूर जा रही है


82

मैंने देखा है कुछ हाल ही में GitHub पर कुछ लोकप्रिय परियोजनाओं को देख रहा है, कि कोई developशाखा नहीं है । और वास्तव में, GitHub Flow गाइड इसका उल्लेख नहीं करता है। मेरी समझ से, masterहमेशा पूरी तरह से स्थिर होना चाहिए और उत्पादन को प्रतिबिंबित करना चाहिए। यदि डेवलपर्स फ़ीचर शाखाओं पर काम कर रहे हैं, और फिर masterजब वे काम कर रहे हैं, तो उन में विलय कर रहे हैं, इसका मतलब है कि ऐसी अवधि है जहाँ सुविधाओं / सुधारों को विलय किया जा रहा है masterऔर masterशाखा वास्तव में उत्पादन की तुलना में नया है।

क्या टीम के फ़ीचर / फिक्स ब्रांच बनाने develop, उस में वापस मर्ज करने के लिए अधिक समझदारी नहीं होगी , और फिर जब अगला संस्करण रिलीज़ के लिए पूरी तरह से तैयार developहो जाता है , तो मर्ज हो जाता है masterऔर एक टैग बनाया जाता है? कल्पना करें कि लोग सीधे विलय कर रहे हैं master, और उत्पादन में बग की सूचना दी जाती है, जिसे ठीक करना मुश्किल हो जाता है क्योंकि masterशाखा कोडबेस काफी बदल गया है। तब देवों को केवल उपयोगकर्ता को यह बताने के लिए इंतजार करना पड़ता है कि अगली समस्या को देखने के लिए अगली रिलीज तक इंतजार करना होगा।

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


11
कई संभावित वर्कफ़्लोज़ हैं जो गिट सक्षम बनाता है। सभी प्रोजेक्ट्स के लिए gitflow या github फ्लो का उपयोग करने की अपेक्षा नहीं की जानी चाहिए।

बहुत ही रोचक सवाल। मैंने nvie.com/posts/a-successful-git-branching-model के साथ वर्षों काम किया है और मुझे कहना है कि मुझे यह पसंद है। मुझे जो सबसे ज्यादा पसंद है, वह यह है कि a) मास्टर वह है जो उत्पादन पर है और जो संस्करणों और ख के लिए भी लागू होता है) एक हॉटफिक्स और एक विशेषता के बीच एक स्पष्ट अंतर है, वे क्रमशः मास्टर पर विकसित और विकसित होते हैं। हालाँकि, इस चर्चा का अनुसरण करने के बाद मुझे संदेह होने लगा है कि क्या यह चीजों की अधिकता है। उस पर कोई राय?
Aspasia

1
मुझे इस अवधारणा से नफरत है कि मास्टर उत्पादन में क्या है का एक रिकॉर्ड है। अगर हमें यह जानने की जरूरत है कि उत्पादन में क्या है, तो हमें सिर्फ उत्पादन करना चाहिए और उत्पादन में जो कुछ है, उसे ठीक से दर्शाते हुए गुरु पर भरोसा नहीं करना चाहिए।
जिम वी

जवाबों:


52

यह सीआई मानसिकता से आता है जहां दिन में कई बार एकीकरण होता है।

दोनों के पक्ष और विपक्ष हैं।

हमारी टीम पर हमने विकसित शाखा को छोड़ दिया है और साथ ही हमने महसूस किया है कि इसमें कोई अतिरिक्त लाभ नहीं है बल्कि कुछ कमियां हैं। कमियों की भरपाई के लिए हमने अपने CI सॉफ्टवेयर (टीमसिटी) को कॉन्फ़िगर किया है:

  1. एक विशिष्ट प्रतिबद्ध की तैनाती सक्षम करें। दूसरे शब्दों में: हम एक शाखा की तैनाती नहीं करते हैं। हम एक कमिटमेंट तैनात करते हैं।
  2. हम या तो मास्टर या शाखाओं को एक हॉटफ़िक्स / उपसर्ग के साथ शुरू कर सकते हैं।

इसका कारण यह है क्योंकि सभी पुल अनुरोध में संभावित रूप से भरोसेमंद कोड होते हैं लेकिन इसका मतलब यह नहीं है कि हम मास्टर में सभी कमिट्स को तैनात करते हैं।

मुख्य कारण हमने विकसित शाखा को छोड़ दिया क्योंकि यह बहुत बड़ा है और बहुत समय लगता है कि यह वास्तव में इसमें निहित है। अगर हमने कुछ समय से पहले ही कुछ तैनात किया है तो हम केवल एक हॉटफ़िक्स शाखा को छोड़ देते हैं और इसे सीधे तैनात करते हैं।


10
एक या दो साल के लिए एक विकसित शाखा के साथ काम करने के बाद, बस इसे अब हर बार मास्टर में विलय करने के लिए, मैं सिर्फ इतना कह सकता हूं:
अमन

दिलचस्प। इसलिए मुझे लगता है कि जब आप उदाहरण के लिए संस्करण 1.3 जारी करते हैं master, तो आप एक विशिष्ट कमिट को टैग करते हैं , इसलिए यदि आप बाद में बग की स्थिति पैदा करते हैं master, तो प्रवाह की स्थिति में है, तो आप आसानी से 1.3 टैग से एक हॉटफिक्स को शाखा कर सकते हैं?
22 मई को ffxsam

5
मैं कहता हूं कि "विकसित" का लाभ इस बात पर बहुत निर्भर करता है कि आप किस तरह का सॉफ़्टवेयर बना रहे हैं, यह कैसे तैनात किया जाता है, और आपको कई लाइव संस्करणों का समर्थन करने की आवश्यकता है या नहीं।
एक्सल

1
@ffxsam को हमें टैग करने की भी आवश्यकता नहीं है क्योंकि हम ट्रैकिंग कर रहे हैं कि वर्तमान में किस git id को तैनात किया गया है। यह दोनों TeamCity में लॉग इन किया गया है और तैनात dll और azure प्रबंधन पोर्टल में शाखित है। इसलिए हमें टीम टैग द्वारा किए गए स्वचालित टैगिंग को छोड़कर आगे टैगिंग की आवश्यकता महसूस नहीं हुई है। यदि आपको लगता है कि टैगिंग फिट बैठता है तो आप बेहतर तरीके से काम करते हैं, यह इसे अच्छी तरह से हल करेगा। लेकिन हाँ, एक ब्रांच बनाने के लिए वर्तमान में तैनात परिवर्तन से सीधे सिद्धांत शाखा में।
एबेन स्कोव पेडरसन

25

यदि आपकी प्रक्रिया जारी करने के लिए जटिल है, तो एक विकसित शाखा अधिक मायने रखती है और आपको गंभीर रिहाई-उम्मीदवारों की आवश्यकता होती है।

उदाहरण के लिए, कल्पना करें कि आप सॉफ्टवेयर लिख रहे हैं जो कारों पर फर्मवेयर है। यह तय करने के लिए गैर-तुच्छ है और यह संभव है कि कोई भी रिलीज वास्तविक हार्डवेयर पर चलने वाले गैर-सीआई / एकीकरण परीक्षणों का एक व्यापक सेट होगा।

उस मामले में यह एक "रिलीज उम्मीदवार" को एक गैर-मास्टर शाखा (जैसे "विकसित") में अलग करने के लिए और अधिक समझ में आ सकता है। यह आपकी टीम को उन परीक्षणों को चलाने की अनुमति देता है जिनके पास विशेषताओं को मर्ज करने के लिए एक शाखा है।

Webapps या अन्य आसानी से अपडेट किए गए सॉफ़्टवेयर में यह बाधा नहीं है।

हालाँकि, ध्यान दें कि:

  • गितुब पर कई (सबसे?) परियोजनाओं में इस तरह की बाधा नहीं है
  • एक मुख्य "मास्टर" उसी उद्देश्य को पूरा करता है
  • "एक पीआर बनाम मास्टर बनाने" का वर्कफ़्लो "एक ऐसी शाखा के खिलाफ पीआर बनाना जो आपको रेपो पर तुरंत नहीं पता है" की तुलना में कहीं अधिक सार्वभौमिक है।

18

मैंने परियोजनाओं में दो दर्शन देखे हैं, और मुझे लगता है कि विकल्प सिर्फ स्वाद की बात है:

  1. 'मास्टर' को प्रोडक्शन रिलीज़ के रूप में नामित करें और 'विकसित' शाखा में विकसित करें।

  2. 'मास्टर' में विकसित और स्थिर उत्पादन रिलीज के लिए एक अलग नाम वाली शाखा है। यह और भी अधिक समझ में आता है अगर आपकी परियोजना की एक समय में कई रिलीज़ शाखाएँ हैं (जैसे, वर्तमान पसंदीदा एक रिलीज़ -१. 1.8 है, लेकिन आप अभी भी रिलीज़ -१. are बनाए रख रहे हैं)।

दोनों आम दृष्टिकोण हैं, और उनके पेशेवरों और विपक्ष हैं।


मैं आपसे सहमत हुँ। हम रिलीज की शाखाएं बनाना पसंद करते हैं और अगली रिलीज से पहले तक इसे बनाए रखते हैं। यदि हमें कोई हॉट-फ़िक्स करना है, तो हम अंतिम रिलीज़ ब्रांच को चेक करते हैं और उस पर काम करते हैं, फिर उन हॉट फ़िक्स को मास्टर / डेवलप ब्रांच में मर्ज करते हैं
जॉनी

ठीक ठीक। What मास्टर ’को जो करना चाहिए वह ज्यादातर शब्दार्थ है। सही पाने के लिए बुनियादी बात यह है कि जब तक आपके पास ऐसा करने के लिए वास्तव में अच्छा कारण न हो, तब तक कई जीवित शाखाओं को सीधे-सीधे सिंक करने से बचना चाहिए। गिट फ्लो में 'मास्टर' की शाखा 'विकसित' की एक पिछड़ी हुई प्रतिकृति है, इसलिए यह वास्तव में गिनती नहीं करता है। विरोधी पैटर्न मुख्य विकास शाखा को उन परिवर्तनों को आयोजित करने की अनुमति देता है जो कभी भी रिलीज में नहीं जाते हैं, जो कि एक चौंकाने वाला सामान्य अभ्यास है जो मैंने देखा है। ऊपर वर्णित दोनों मॉडल इसे रोकते हैं, यही वजह है कि वे काम करते हैं।
जॉन मिकाओ

7

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

यदि एक महत्वपूर्ण बग उत्पादन में एक पल में पाया जाता है जब मास्टर जारी नहीं किया जा सकता है, तो टैग को चेकआउट करना और वहां से एक नया "हॉटफ़िक्स-फॉर-रिलीज़-1.2.0" शाखा शुरू करना काफी आसान है। लेकिन यह दुर्लभ होना चाहिए।

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


5

यदि डेवलपर्स फ़ीचर शाखाओं पर काम कर रहे हैं, और तब उन्हें मास्टर में विलय कर रहे हैं, जब वे कर रहे हैं, इसका मतलब है कि ऐसी अवधि है जहाँ सुविधाओं / सुधारों को विलय किया जा रहा है masterऔर masterशाखा वास्तव में उत्पादन की तुलना में नया है।

...

कल्पना करें कि लोग सीधे मास्टर में विलय कर रहे हैं, और उत्पादन में बग की सूचना दी जाती है, जिसे ठीक करना मुश्किल हो जाता है क्योंकि मास्टर शाखा कोडबेस काफी बदल गया है।

वह गितुब फ्लो नहीं है।

यह आपके लिंक के अनुसार गिथब फ्लो की तैनाती / मर्ज प्रक्रिया है:

तैनात

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

मर्ज

अब जब आपके परिवर्तनों को उत्पादन में सत्यापित किया गया है, तो अपने कोड को मास्टर शाखा में मर्ज करने का समय है।

(जोर मेरा)

दूसरे शब्दों में, masterउत्पादन से आगे कभी नहीं होगा। इसी तरह, masterहमेशा एक स्थिर, भरोसेमंद राज्य (अनदेखे बग से अलग) में रहेगा, क्योंकि विलय होने से पहले हर चीज की समीक्षा की जाती है, परीक्षण किया जाता है और उत्पादन के लिए रोल आउट किया जाता है master


अच्छा! यह महान सहज ज्ञान युक्त बनाता है - masterहमेशा आपकी रोलबैक स्थिति होती है यदि आपके द्वारा उत्पादन में धक्का देने वाली सुविधा शाखा विफल हो जाती है। यदि ऐसा नहीं होता है, तो यह विलय masterहो जाता है और नई गिरावट बन जाती है। मुझें यह पसंद है।
बिल होर्वाथ

1

मुझे जो समस्या दिखाई देती है वह यह है कि गिट / हब फ्लो की तैनाती / मर्ज एक विशेषता मानती है कि एक समय में विकसित / परीक्षण / विलय / तैनाती की जा रही है - और अक्सर मेरे अनुभव में ऐसा नहीं होता है। यदि हम एक समय में एक फीचर को मर्ज करते हैं, तो रिग्रेशन के मुद्दों के लिए एक बड़ा मौका है - केवल विशेषताओं को मास्टर में विलय करने और संभवतः उत्पादन में शामिल होने के बाद।

कई विशेषताओं का परीक्षण करने, कई विशेषताओं को मर्ज करने और उन्हें तैनात करने का एक तरीका होना चाहिए। मैं एक 'बंडल शाखा' (परीक्षण से तैयार फीचर शाखाओं के साथ मास्टर से बनाई गई एक शाखा) का उपयोग कर रहा हूं जो कि क्यूए / यूएटी में तैनात हो जाती है। ऊट के दौरान सुधार केवल सुविधा शाखा पर होते हैं, और वे बंडल शाखा में फिर से विलय हो जाते हैं। बंडल शाखा के एक उपधारा को मंजूरी देने के बाद, बंडल के भीतर केवल उन अनुमोदित सुविधाओं को मास्टर करने के लिए पुल-अनुरोध किया जाता है - और चक्र निरंतर है।

मैं Gitflow के साथ इसका उपयोग करता हूं, लेकिन GitHub प्रवाह के लिए इसका उपयोग करने के लिए विचार करना। क्यूए / यूएटी एक समय में कई फीचर महत्व का लगता है। GitHub प्रवाह के साथ एक और मुद्दा यह है कि यह सभी sr डेवलपर्स को मानता है, और यह हमेशा ऐसा नहीं होता है।

मैं इसके सरलीकृत-नेस के कारण GitHub प्रवाह का उपयोग करूंगा। सुविधा जैसी एक बंडल के साथ, मुझे लगता है कि यह बेहतर तैयार होगा। संभव है कि बंडल रिलीज के समान हो; हालाँकि, मैं अभी भी यह विचार कर रहा हूँ।

एक अन्य मुद्दा यह है कि मास्टर में विलय से पहले पुल अनुरोध प्रक्रिया अंत में होती है; हालांकि, कभी-कभी आप व्यवसाय क्यूए परीक्षण से पहले कोड की समीक्षा करना चाहते हैं - इसलिए मर्ज से पहले अच्छी तरह से

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.