सरलीकृत गिट प्रवाह के लिए विकसित शाखा से कैसे छुटकारा पाएं


20

एक निरंतर विकसित वेब परियोजना में (उत्पाद नहीं) वर्तमान में हमारे पास निम्नलिखित ब्रांचिंग रणनीति है, जो मोटे तौर पर गिट प्रवाह पर आधारित है :

  • विकास शाखा: नवीनतम कार्यशील संस्करण
  • मास्टर ब्रांच: वर्जन / जारी किया जाने वाला वर्जन
  • सुविधा शाखाएँ: विकास में सुविधाएँ
  • हॉटफ़िक्स शाखाएँ: रिलीज़ किए गए संस्करण में तत्काल बगफिक्स

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

फ़ीचर शाखाएं विकसित होने के आधार पर बनाई जाती हैं , या अंतिम प्रतिबद्ध से जिसे मास्टर में विलय कर दिया गया है। विकसित करने के लिए एक सुविधा शाखा से एक पुल अनुरोध, एक नि: शुल्क परीक्षण प्रणाली के लिए तैनात किया गया है जहां एकीकरण परीक्षण और स्वीकृति परीक्षण (स्वचालित और मैनुअल) निष्पादित किए जाते हैं। जब सफलतापूर्वक परीक्षण और समीक्षा की जाती है, तो पीआर विलीन हो जाता है, ताकि यह अगली रिलीज का हिस्सा बन जाए (अर्थात विकास से मास्टर में विलय)।

मेरा लक्ष्य

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

मेरे पास निम्नलिखित बाधाएँ हैं:

  • रिलीज़ शेड्यूल किए गए हैं और पूरी तरह से स्वचालित नहीं होने चाहिए
  • जबकि सुविधा शाखाएँ आम तौर पर कम समय तक रहती हैं, कुछ कई हफ्तों तक (जैसे कि एक नया स्वरूप) के लिए अप्रभावित रहती हैं, लेकिन साथ ही साथ परीक्षण करने की आवश्यकता होती है (वर्तमान में विकसित करने के लिए खुले पुल अनुरोध)
  • कभी-कभी एक एकल सुविधा को नियमित रिलीज़ के बाहर जारी किया जाना चाहिए, इसे प्रभावी रूप से एक हॉटफ़िक्स में बदलना। वर्तमान रणनीति के साथ मैं एक सुविधा शाखा को फिर से बना सकता हूं और इसे सीधे मास्टर में विलय कर सकता हूं
  • ऐसा भी होता है कि स्टेजिंग में बाहरी सिस्टम के साथ स्वीकृति परीक्षणों के बाद हमें फीचर्स को वापस रखने की आवश्यकता होती है

जहां मैं संक्रमण के बारे में निश्चित नहीं हूं:

  • वर्तमान में मैं परीक्षण के लिए पुल अनुरोधों का निर्माण कर रहा हूं और रिलीज के लिए मर्ज करता हूं। क्या मैं इसे एकजुट कर सकता हूं?
  • जब नवीनतम रिलीज़ से पहले मास्टर आगे है, तो हॉटफ़िक्स से कैसे निपटें। क्या मुझे हॉटफिक्स शाखाओं से सीधे रिलीज़ का निर्माण और तैनाती करनी चाहिए?
  • क्या उन सुविधाओं से निपटने का एक समझदार तरीका है, जिन्हें पहले ही मर्ज किए जाने के बाद एक रिलीज़ से बाहर रखा जाना चाहिए? क्या इन मामलों के लिए एक अलग विकसित शाखा वास्तव में एक फायदा है? अधिकांश समय मैं reverting को समाप्त करता हूं और फिर से reverting मैन्युअल रूप से वैसे भी करता है।

4
ऐसा लगता है कि एक तरफ, आप कहते हैं कि आपको डीईवी शाखा की आवश्यकता नहीं है, लेकिन फिर समझाएं कि आपको वास्तव में इसकी आवश्यकता क्यों है। फ़ीचर ब्रांच जो हफ्तों तक रहती हैं, उन्हें लंबे समय तक डायवर्ट करने के बाद मास्टर में विलय करना बहुत मुश्किल होगा। क्या आप वाकई DEV के साथ दूर होना चाहते हैं?
डेव स्वर्सकी

@DaveSwersky अच्छा सवाल! मुझे यकीन नहीं है, यही कारण है कि मैं यहां पूछ रहा हूं :) लंबे समय तक रहने वाली सुविधा शाखाओं के बारे में: विलय करने की कठिनाई एक समस्या है जो पहले से मौजूद है और बस दूसरी जगह ले जाया जाएगा। और नियमित रूप से मुख्य शाखा से वापस विलय करने योग्य है। यदि मुख्य शाखा ही गुरु हो तो और अधिक कठिन कैसे होगा?
फाबियन शेंगलर

लंबे समय तक रहने वाली शाखाएं हमेशा एक चुनौती होगी, हालांकि शायद एक डीईवी शाखा की तुलना में मास्टर में विलय की चुनौती अधिक है। उस समस्या का समाधान उन शाखाओं को अल्पकालिक रखने के लिए बेहतर तरीके से काम को तोड़ना हो सकता है। यदि आप विषय / सुविधा शाखाओं को 24-48 घंटे से अधिक जीवित रहने से रोक सकते हैं, तो आपके पास DEV को खत्म करने से बेहतर भाग्य हो सकता है।
डेव स्वार्स्की

1
@FabianSchmengler देव शाखा को हटाने का वास्तविक कारण क्या है? यह वास्तव में लगता है जैसे आपको मामलों के लिए इसकी आवश्यकता होती है जब चीजें नियोजित नहीं होती हैं।
avi

इसे मास्टर कहें या विकसित करें या आप जो भी चाहते हैं, आपको वास्तविक सीआई होना चाहते हैं, या यदि आप इसे फीचर शाखाओं को सौंपते हैं, तो आपको एकीकरण शाखा की आवश्यकता होगी, यह अलगाव में वर्तमान रिलीज के खिलाफ केवल बाहरी एकीकरण होगा।

जवाबों:


6

IMHO समस्याओं को आप का सामना कर रहे गरीब शाखा रणनीति आप के साथ शुरू की सिर्फ एक पक्ष प्रभाव हैं: आप प्रभावी रूप से पर नए विकास जुताई कर रहे हैं develop(यानी क्या करने की दिशा में और converges भविष्य उत्पादन कोड) के माध्यम से वर्तमान पर उत्पादन कोड master। यह भविष्य के कोड से विशिष्टताओं और विरोधाभासों की ओर अग्रसर करता है क्योंकि भविष्य का कोड वर्तमान से हटता है:

  • नया विकास उत्पादन को नष्ट कर देता है - मर्ज developहोने के बाद देखे जाने वाले प्रतिगमनmaster
  • उत्पादन को स्थिर करना भविष्य के विकास को धीमा करता है - आपको developइसे विलय के लिए पर्याप्त रूप से अच्छा बनाने के लिए स्थिर करने की आवश्यकता हैmaster

छोड़ने developसे बहुत मदद नहीं मिलेगी (आप) समस्या को खत्म नहीं कर रहे हैं, आप समस्या के develop-specific भाग को केवल में स्थानांतरित कर रहे हैं master

भविष्य की रिलीज़ के लिए विकास के साथ हस्तक्षेप को रोकने के लिए वर्तमान / भविष्य के विकास के पीछे उत्पादन को स्थानांतरित करने के लिए एक बेहतर दृष्टिकोण होगा , जैसा कि इस तस्वीर में दिखाया गया है कि आपका ब्रांचिंग मॉडल क्या है? :

यहां छवि विवरण दर्ज करें

कृपया ध्यान दें कि मैं केवल ऊपर की छवि में रिलीज शाखाओं का उल्लेख कर रहा हूं, ट्रंक में क्या हो रहा है पर नहीं।

यह आपके लिए कैसे काम करेगा:

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

यदि कोई हॉटफ़िक्स केवल उत्पादन संस्करण पर लागू होता है, लेकिन masterयह सीधे releaseशाखा के लिए प्रतिबद्ध नहीं है । यदि यह दोनों पर लागू होता है, तो यह आम तौर पर masterपहले और चेरी-पिक / डबल-प्रतिबद्ध के साथ- releaseसाथ शाखा के लिए भी प्रतिबद्ध है ।

अब यह देखना कि कौन सी चीज़ master(जो उस बिंदु से गुज़रती है जहाँ पर वर्तमान releaseशाखा को खींचा जाता है) है, आपके पास 2 विकल्प हैं:

  • आज आप जैसे हैं वैसी ही शाखाओं को जारी रखें, सिवाय इसके कि वे बंद रहेंगे master, नहीं develop। उन्हें हॉट फ़िक्स में परिवर्तित करना संभव है - आपको releaseइसके बजाय उन्हें संबंधित ब्रांच में रिबेट करना होगाmaster
  • निरंतर एकीकरण पर स्विच करें और इसके लाभों को पुनः प्राप्त करें (आगे किसी भी समय किया जा सकता है), जिसमें प्रगतिशील तरीके से शामिल हैं - धीरे-धीरे कम और कम सुविधा वाली शाखाओं को खींचें।

अगर आपको यह तरीका पसंद है

  • एक नामकरण रणनीति स्थापित करें:
    • आपके पास एक ही नाम के साथ जारी रिलीज़ शाखा नहीं हो सकती है
    • आप एक उत्पादन रिलीज शाखा को रिबेट या सिंक नहीं कर सकते हैं
  • उस नामकरण रणनीति का अनुसरण करते हुए, तुरंत एक releaseXशाखा खींचेंmaster
  • जाने से रोकें develop, वे जल्द ही सीधे जा रहे हैं master
  • में विलीन developहो जानाmaster
  • डेवलपर्स को masterइसके बजाय अपने कार्यक्षेत्र को फिर से बनाने के लिए निर्देश दें develop
  • आवागमन के masterलिए खुला
  • developयदि आप चाहें तो हटा दें (या इसे स्थायी रूप से बंद / केवल संदर्भ के लिए पढ़ें)

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

आपके पास निरंतर परिनियोजन विकल्प भी है, जो विकास को उत्पादन के साथ एक ही स्थान पर रखता है (जैसा कि इसे आगे बढ़ाने या इसे आगे बढ़ाने के लिए), लेकिन इसके लिए आपको एक संस्कृति बदलाव की आवश्यकता है (जैसा कि यह सभी एकीकरण और सुविधा शाखाओं को छोड़ने का अर्थ है)।
डैन कॉर्निलेस्कु

मैं उस आरेख को पहचानता हूं :)
paul_h

11

मान लीजिए कि आप मास्टर शाखा को निकालते हैं (आप अपनी टीम को भ्रमित करने के लिए मास्टर का नाम बदल सकते हैं यदि आप बाद में पसंद करते हैं) और बस रिलीज़ के लिए टैग का उपयोग करें या तो विकसित या हॉटफ़िक्स शाखाओं पर। आपने एक शाखा निकाल ली, लेकिन अंतर सिंटैक्स में बदलाव का है। बदलाव के लिए बदलें।

अब कहते हैं कि आप वास्तव में बंद मास्टर शाखा को रखने के साथ विकसित होते हैं। क्या होगा कि कोड का एकीकरण धीमा होगा, यह फीचर शाखाओं में लंबे समय तक अलग रहेगा, विशेष रूप से रिलीज की तारीखों के करीब। यह हर बार विलय की कठिनाई को बढ़ाएगा और प्रक्रिया को धीमा कर देगा।

जिन बाधाओं के बीच आपने नीचे रखा है, मुझे इस तरह के बदलाव का कोई सकारात्मक प्रभाव दिखाई नहीं देता है। इसमें अड़चनों को शांत करने की आवश्यकता होगी, विशेष रूप से पहले वाले को।


5

आप पुल-अनुरोध और हॉट-फ़िक्स शाखाओं में से प्रत्येक पर पहले से ही निर्माण और परीक्षण कोड बना रहे हैं। इसका मतलब यह है कि कुल मिलाकर, पुल-अनुरोध पर लंबित सभी शाखाओं का योग आपकी आभासी developशाखा है।

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

जब आप एक रिलीज़ बनाते हैं master, तो आप आमतौर पर उस रिलीज़ पर एक टैग बनाते हैं। बाद में हॉटफ़िक्स उस टैग का उपयोग एक नई हॉटफ़िक्स शाखा बनाने के लिए कर सकते हैं जिसमें से एक परिनियोजन किया जाएगा, भले ही किनारे masterपहले से ही आगे हों। इस हॉटफ़िक्स शाखा पर आप शायद एक छोटी सी रिलीज़ को भी टैग करेंगे, और सुनिश्चित करें कि परिवर्तन को मर्ज कर दिया गया था master

एक रिलीज से मर्ज किए गए फीचर्स को हटाना गिट के साथ करना काफी कठिन है। इसके लिए सबसे अच्छा तंत्र git revertमर्ज कमिट पर उपयोग करना होगा । लेकिन इससे इन सुविधाओं / परिवर्तनों को वापस पाना लगभग असंभव हो जाता है, और इतिहास सब गड़बड़ हो जाता है।

कोड की तैनाती, और सुविधाओं को जारी करने के लिए जुदाई को संभालने के लिए एक बेहतर तरीका, सुविधा झंडे हैं । यदि आपके डेवलपर कोड में कुछ शर्तों के पीछे अपनी सुविधाओं को छिपा सकते हैं, तो आप उनके कोड को तैनात कर सकते हैं, लेकिन सुविधा को बंद कर सकते हैं। यह एक अलग विषय है, लेकिन इसके बारे में बहुत सी जानकारी मौजूद है (एक क्यू एंड ए पर devops.SE सहित)।


2

अच्छी तरह से @ dan-cornilescu इसे आपकी विशेष समस्या के लिए अच्छी तरह से कहता है, लेकिन ट्रंक-बेस्ड डेवलपमेंट (कंटीन्यूअस डिलीवरी, लीन एंटरप्राइज और द DevOps हैंडबुक में उल्लिखित) के लिए अधिक सामान्य मामला यहां बनाया गया है: https://trunkbdedevelopment.com/

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