निरंतर एकीकरण करते समय सर्वश्रेष्ठ ब्रांचिंग रणनीति?


100

जब आप निरंतर एकीकरण करना चाहते हैं, तो उपयोग करने के लिए सबसे अच्छी शाखा रणनीति क्या है?

  1. रिलीज ब्रांचिंग: ट्रंक पर विकसित, प्रत्येक रिलीज के लिए एक शाखा रखें।
  2. फ़ीचर ब्रांचिंग: प्रत्येक सुविधा को एक अलग शाखा में विकसित करें, केवल एक बार स्थिर होने पर मर्ज करें।

क्या यह इन दोनों रणनीतियों का एक साथ उपयोग करने के लिए समझ में आता है? जैसा कि, आप प्रत्येक रिलीज़ के लिए शाखा करते हैं लेकिन आप बड़ी विशेषताओं के लिए भी शाखा देते हैं? निरंतर एकीकरण के साथ इन रणनीतियों में से एक बेहतर है? एक अस्थिर ट्रंक का उपयोग करते समय निरंतर एकीकरण भी समझ में आएगा?


2
साइड नोट: कुछ का तर्क है कि नई सुविधाओं के रूप में भी इसे रखा जाता है, सब कुछ हमेशा स्थिर होना चाहिए। दूसरी ओर, यह कुछ आदर्शवादी हो सकता है।
कीथ पिंसन

जवाबों:


21

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

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

आशा है कि आपको लिंक दिलचस्प लगे।


हमने बांस को प्रति कार्य कोडिस्कॉर्सवेयर.blogspot.com/2012/02/… के अनुसार शाखा करने के लिए समर्थन जोड़ा , और ऐसा लगता है कि उनका नवीनतम संस्करण मूल रूप से कई संस्करण नियंत्रणों के साथ करेगा, जिसमें DVcs भी शामिल हैं।
पाब्लो

20

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

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

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

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

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

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


5
मुझे यकीन नहीं है कि मैं सहमत हूं कि आप जो वर्णन करते हैं वह 50 डेवलपर्स के तहत टीमों के लिए कोई मतलब नहीं है। मैं बहुत छोटी टीमों के लिए भी लाभ देख सकता हूं। +1
आर्डवार्क

2
बेशक, किसी भी आकार की टीमों के लिए लाभ हैं। सवाल यह है कि किस टीम ने भारी प्रक्रिया से जुड़ी लागतों को आगे बढ़ाया है।
जिरी क्लौडा

यह GitFlow, और / या GitHubFlow, मॉडल के समान है। मुझे नहीं लगता कि ये मॉडल निरंतर एकीकरण (CI) की सुविधा देते हैं। मेरी राय में, इन मॉडलों पर ट्रंक आधारित विकास एक महत्वपूर्ण सुधार है।
यानि

आप देख सकते हैं कि यह टिप्पणी वास्तव में गित प्रवाह के मूल रिलीज की पूर्व-तिथि है। यह बिल्कुल निश्चित नहीं है कि आप "बेहतर" से क्या मतलब है। मैंने 1, 5, 25, 150, 1,000 और 20,000 डेवलपर्स की परियोजनाओं का समर्थन किया है जो कुछ हद तक एकीकृत थे। आवश्यकताएं बदलती हैं और "बेहतर" बहुत सापेक्ष शब्द है। क्या आपको कभी भी कोड को वापस करने की आवश्यकता है? सुरक्षा सुधार? यदि नहीं, तो आपका जीवन सरल है। सास ट्रंक आधारित विकास द्वारा लगाए गए प्रतिबंधों का प्रत्यक्ष परिणाम है। फ़ीचर फ़्लैग्स, फ़ीचर शाखाओं जैसे ही जटिल होते हैं। सिवाय आपको केवल ग्राहकों से पता चलता है जब उनका एक क्रम टूट जाता है।
जिरी क्लौडा

9

मुझे व्यक्तिगत रूप से एक स्थिर ट्रंक होने के लिए बहुत क्लीनर लगता है और फीचर ब्रांचिंग करता है। इस तरह, परीक्षकों और जैसे को एक एकल "संस्करण" पर बने रहने के लिए मिलता है और ट्रंक से अपडेट होता है जो किसी भी सुविधा का परीक्षण करने के लिए कोड है।

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

अतिरिक्त बोनस के रूप में, एकीकरण परीक्षण का कुछ स्तर है जो स्वचालित रूप से आता है।


इसके अलावा, क्या आप अभी भी प्रत्येक बड़ी रिलीज के लिए शाखा और टैग करते हैं? या सिर्फ टैग?
KingNestor

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

@ मैं कहूंगा कि संभवत: इस बात पर निर्भर करता है कि आप प्रमुख रिलीज़ को क्या कहते हैं, लेकिन किसी भी स्थिति में आप टैग कर सकते हैं, और बाद में जब आपको इसकी आवश्यकता हो तो शाखा कर सकते हैं (टैग के आधार पर :))
8

5

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

http://martinfowler.com/articles/continuousIntegration.html#EveryoneCommitsToTheMainlineEveryDay

संपादित करें

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

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

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

अन्य संस्करण

इस विषय पर एक से अधिक मत हैं। यहाँ एक ब्लॉग पोस्ट है जो CI के साथ प्रो फीचर ब्रांचिंग है

http://jamesmckay.net/2011/07/why-does-martin-fowler-not-understand-feature-branches/


दिलचस्प है, अब इस पोस्ट को नहीं पा सकते हैं।
जिरोंग हू

5

रिलीज शाखाएं बहुत उपयोगी हैं, और यहां तक ​​कि पूरी तरह से आवश्यक हैं, अगर आपको अपने ऐप के कई संस्करणों को बनाए रखने की आवश्यकता है।

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

इसलिए मेरे लिए दोनों तंत्रों का उपयोग करना एक बहुत अच्छी रणनीति है।

एसवीएन की पुस्तक से दिलचस्प लिंक ।


4

मैं हाल ही में git का उपयोग करते समय इस मॉडल को पसंद आया हूं । यद्यपि आपके प्रश्न को "svn" टैग किया गया है, फिर भी आप इसका कुछ उपयोग करने में सक्षम हो सकते हैं।

इस मॉडल में "विकसित" शाखा (या जो भी आप इसे कहते हैं) में कुछ हद तक निरंतर एकीकरण हो सकता है, हालांकि भविष्य के रिलीज के लिए लंबे समय तक चलने वाली सुविधा शाखाएं होने से यह इतना कठोर नहीं होगा कि कहीं न कहीं कोड में होने वाले हर बदलाव पर विचार करें। सवाल यह है कि क्या आप वास्तव में ऐसा चाहते हैं। मार्टिन फाउलर करता है।


2

आपकी ब्रांचिंग रणनीति को निर्धारित करने में निरंतर एकीकरण किसी भी प्रकार का कारक नहीं होना चाहिए। आपकी शाखा के दृष्टिकोण को आपकी टीम, विकास के तहत प्रणाली और आपके लिए उपलब्ध उपकरणों के आधार पर चुना जाना चाहिए।

यह कहने के बाद ...

  • आपके द्वारा वर्णित दोनों दृष्टिकोणों में CI का उपयोग न करने का कोई कारण नहीं है
  • वे दृष्टिकोण संयोजन में काफी अच्छी तरह से काम करते हैं
  • दोनों में से कोई भी काम दूसरे की तुलना में "बेहतर" नहीं है
  • सीआई एक अस्थिर ट्रंक के साथ कुल समझ में आता है

इस पृष्ठ पर चौथे प्रश्न में सभी का उत्तर दिया गया था, जिससे आपने आरेख लिया था: http://blogs.collab.net/subversion/2007/11/branching-strat/


2

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

मेनलाइन मॉडल में सर्वश्रेष्ठ परिचय के लिए, इसे पढ़ें: https://web.archive.org/web/20120304070315/http://oreilly.com/catalog/practicalperforce/chapter/ch07.pdf

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

http://www.infoq.com/articles/agile-version-control


ओ'रिली अध्याय अब सुलभ नहीं है
जेसन एस

1

जब हमने अपनी टीम शुरू की, तो हमें वेंडर से एक रिलीज-आधारित रणनीति विरासत में मिली, जो मूल रूप से उस प्रणाली को विकसित करती थी जिसके बारे में हम प्रभारी बनने जा रहे थे। यह उस समय तक काम किया जब हमारे ग्राहकों ने अनुरोध किया कि कई विकसित सुविधाओं को एक रिलीज (कोड के ~ 250k लाइनों, ~ 2500 फ़ाइलों, XP एसडीएलसी के साथ स्क्रैम) में शामिल नहीं किया जाना चाहिए।

फिर हमने फीचर-आधारित शाखाओं को देखना शुरू किया। इसने कुछ समय के लिए भी काम किया - जैसे 2 महीने तक जब तक हमें यह पता नहीं चला कि हमारी प्रतिगमन परीक्षण प्रक्रिया में 2 सप्ताह का समय लगेगा जो कि जारी होने की अनिश्चितता के साथ मिलकर एक बड़ी असुविधा पैदा करता है।

शुद्ध SC रणनीतियों के अंतिम "ताबूत में कील" तब आया जब हमने फैसला किया कि हमारे पास 1. स्थिर ट्रंक होना चाहिए और 2. उत्पादन में ST, UAT और प्रतिगमन परीक्षण किए गए बिन्नेस (न कि केवल स्रोत - CC का विचार करें) होना चाहिए।

यह हमें एक ऐसी रणनीति तैयार करने के लिए प्रेरित करता है जो सुविधा और रिलीज़-आधारित SC रणनीतियों के बीच एक संकर है।

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

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

अब यहाँ समुदाय के लिए एक प्रश्न है - हम स्पष्ट रूप से इस तथ्य के कारण निरंतर एकीकरण करने में कठिनाई कर रहे हैं कि विकास कई शाखाओं पर होता है और क्रूज़कंट्रोल के पुनर्निर्माण ओवरहेड। क्या कोई सुझाव और सलाह दे सकता है?


मैं जरूरी निष्कर्ष के साथ सहमत नहीं हूं, लेकिन आपकी प्रक्रिया की चर्चा के लिए धन्यवाद। कोई एक आकार-फिट-सभी समाधान नहीं है।
RaoulRubin

0

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

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

ps आपको उन दृष्टिकोण संदर्भ कहां से मिले? - ऐसा नहीं लगता कि वे रेखांकन सभी विकल्पों का प्रतिनिधित्व करते हैं

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


यह कुछ और भी है। लेकिन मुझे लगता है कि फ़ीचर ब्रांचिंग और रिलीज़ ब्रांचिंग 2 सबसे आम हैं।
KingNestor

0

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

ब्रांचिंग का कोई भी रूप कंटिन्यूअस इंटीग्रेशन का विरोधी है।

वह यह भी कहता है,

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

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

मैं अपने GIT रेपो में ट्रंक, "मास्टर" पर काम करता हूं। मैं स्थानीय रूप से मास्टर करने के लिए प्रतिबद्ध हूं और जब मैं नेटवर्क करता हूं, तो मेरे केंद्रीय मास्टर रेपो जहां सीआई चलता है, तुरंत धक्का देते हैं। बस!

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

मैं अमूर्त, अंधेरे-विमोचन और कभी-कभी सुविधा-झंडे द्वारा शाखा का उपयोग करता हूं। बदले में मुझे जो मिलता है वह तेज़, निश्चित (कम से कम मेरे परीक्षण की गुणवत्ता) प्रतिक्रिया के लिए है।


डेव फ़ार्ले और जेज़ विनम्र ब्रांचिंग पर अपने रुख में गलत हैं। इसका कारण यह है कि यह महत्वपूर्ण धारणा को कूटबद्ध करता है "आपको कभी भी फीचर स्तर पर कोड में हेरफेर नहीं करना पड़ेगा और यदि, तो यह महंगा ऑपरेशन होना ठीक है" और वे एक अन्य धारणा पर अपने आकलन को आधार बनाते हैं "विलय स्वचालित रूप से बहुत महंगा है" विलय लगभग बड़े पैमाने पर असंभव है ”। यदि वे दो धारणाएं सच नहीं हैं, यदि आप दुनिया में रहते हैं जहां विलय सस्ता है, लेकिन बैक पोर्ट और सुरक्षा सुधारों के लिए फीचर स्तर पर कोड में हेरफेर करने की आवश्यकता होती है, तो उनके बयान टूट जाते हैं। यह एक दुर्लभ मामला है।
जिरी क्लौडा

कुछ कंपनियों को भी भविष्य के रिलीज के लिए सुविधाओं को आगे बढ़ाने की जरूरत है, उन सुविधाओं के कार्यान्वयन में बाधाएं आने के बाद और रिलीज को रोक रही हैं। कभी-कभी सास उत्पादों की तरह कोड को छोड़ने का विकल्प होता है, लेकिन यदि कोड ग्राहकों को जारी किया जाता है, तो यह एक विकल्प नहीं हो सकता है क्योंकि यह प्रतियोगियों द्वारा विश्लेषण किया जा सकता है। इन दिनों इतना कोड संकलित नहीं किया जाता है और भले ही यह कोड में परिभाषित / सुविधा झंडे शाखाओं के रूप में एक ही जटिलता स्तर पर हो।
जिरी क्लौडा

-3

मुझे लगता है कि आपके द्वारा उपयोग किए जाने वाले उपकरण यहां एक बड़ा कारक हैं।

  • यदि आप तोड़फोड़ का उपयोग कर रहे हैं, तो विकल्प 1 के साथ चिपका और शाखाओं से जारी करें।
  • यदि आप GIT का उपयोग कर रहे हैं, तो विकल्प 2 आपके लिए अच्छा काम करेगा।

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