आपको कब शाखा लगानी चाहिए?


जवाबों:


59

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

सामान्य तौर पर, आपको दो शाखा प्रकार दिखाई देंगे:

  • फ़ीचर ब्रांच: यदि कोई विशेष सुविधा इतनी विघटनकारी है कि आप नहीं चाहते कि पूरी विकास टीम उसके शुरुआती चरण में प्रभावित हो, तो आप एक ब्रांच बना सकते हैं, जिस पर यह काम किया जा सके।

  • फ़िक्सेस ब्रांच: जबकि मुख्य ट्रंक पर विकास जारी है, फ़िक्सेस शाखा को सॉफ़्टवेयर के नवीनतम रिलीज़ किए गए संस्करण में होल्ड करने के लिए बनाया जा सकता है।

आपको निम्नलिखित लेख की जाँच करने में रुचि हो सकती है, जो ब्रांचिंग के सिद्धांतों की व्याख्या करता है, और उनका उपयोग कब करना है:


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

82

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

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

लेकिन वह मॉडल जल्दी ही अपनी सीमा दिखाता है:

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

तो आपका जवाब वहीं है:
जब भी आप पीछा नहीं कर सकते हैं और एक शाखा में दो विकास प्रयासों को रिकॉर्ड नहीं करना चाहिए।
(बनाए रखने के लिए एक भयानक जटिल इतिहास के बिना)।


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

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

एक शाखा एक टैग नहीं है (एसवीएन एक रिवीजन सिस्टम है, जो सस्ती फाइल कॉपी के साथ निर्देशिकाओं के माध्यम से ब्रांचिंग और टैगिंग की तरह संस्करण सुविधा का प्रस्ताव देने की कोशिश करता है : इसका मतलब यह नहीं है कि एक टैग एक शाखा है)

एक शाखा को परिभाषित करने का मतलब है कि एक मर्ज वर्कफ़्लो को परिभाषित करना : आपको यह जानने की ज़रूरत है कि जब आप इसके साथ कर रहे हैं तो अपनी शाखा को कहाँ मर्ज करें।
उसके लिए, विभिन्न प्रकार की शाखाओं के बीच वर्कफ़्लो को मर्ज करने के लिए प्रैक्टिकल परफोर्स (लॉरा WINGERD - O'Reilly) का अध्याय 7 एक अच्छा परिचय (VCS अज्ञेय) है: " हाउ सॉफ्टवेयर इवॉल्व्स " (pdf)

यह शब्द कोडलाइन को परिभाषित करता है (शाखा जो कोड के महत्वपूर्ण विकास के चरणों को रिकॉर्ड करती है, या तो कुछ बिंदुओं पर टैग के माध्यम से, या शाखा में महत्वपूर्ण विलय के माध्यम से)

यह मेनलाइन मॉडल (रिलीज को रिकॉर्ड करने के लिए एक केंद्रीय कोडलाइन) पेश करता है, और शाखा लगाने के विभिन्न उद्देश्यों का वर्णन करता है:

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

VCS के आसपास अन्य दिलचस्प अवधारणाएं: मूल बातें
(मूल रूप से ClearCase के बारे में, लेकिन यह भी किसी VCS के लिए मान्य है)


19

सभी 21 वीं सदी के SCM आपको बता रहे हैं:

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

आपको मिला:

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

उपकरण जो इसे कर सकते हैं:

उपकरण जो ऐसा नहीं कर सकते हैं:

  • SVN
  • सीवीएस
  • वीएसएस
  • TFS
  • ख़ामख़ाह

1
आप इसे SVN के साथ क्यों नहीं कर सकते हैं ??
yegor256

4
एसवीएन अच्छा विलय नहीं है। सही मर्ज ट्रैकिंग के अभाव में। इसके अलावा, क्योंकि एक शाखा बनाना उन लोगों के समान सस्ता नहीं है जिन्हें मैंने बताया था, यह वास्तविक परिस्थितियों में एक बुरा सपना है।
पाब्लो

बेहतर पता लगाने की क्षमता: आप जितनी बार चाहें उतनी बार क्यों करना चाहेंगे? जब कार्य एक जटिल विशेषता नहीं है, तो एक बार प्रति कार्य पर्याप्त नहीं है? इसके अलावा लोगों से बग आसानी से मुख्य शाखा के लिए अपने तरीके बना सकते हैं और इसे "स्थिर" और "सुरक्षित" नहीं बना सकते हैं, ठीक उसी समय जब वे विलय करते हैं।
पेमियन समदियन

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

1
@PaimanSamadian कई जाँच मध्यवर्ती परिवर्तन और आसानी की समीक्षा को समझाने के लिए महान हैं। इसके अलावा, यदि आप किसी चीज पर कुछ घंटे काम कर रहे हैं, तो कई चेकइन बढ़िया हैं।
पाब्लो

8

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

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


5

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


5

यह निर्भर करता है कि आप किस प्रकार के SCM का उपयोग कर रहे हैं।

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

दस्तावेज़ (छोटा और पठनीय) जिसने मुझे यह समझने में मदद की कि वितरित प्रणालियों में क्या हो रहा है: अंडरस्टैंडमर्क्यूरियल

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

वितरित मॉडल बहुत बेहतर है, मुझे लगता है, और प्रमुख प्रतिमान बनने के लिए केवल अच्छे चित्रमय उपकरणों का अभाव है। हालांकि यह उतना व्यापक रूप से नहीं समझा गया है, और अवधारणाएं अलग हैं, इसलिए यह नए उपयोगकर्ताओं के लिए भ्रमित हो सकता है।


3

मुझे लगता है कि Perforce में लौरा विंगर और क्रिस्टोफर सीवाल्ड से सलाह वास्तव में संक्षिप्त और उपयोगी है:

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

उनमें से प्रत्येक की विस्तृत व्याख्या और अन्य सर्वोत्तम अभ्यास के लिए http://www.perforce.com/sites/default/piles/pdf/perforce-best-practices.pdf देखें ।


3
पी 4 लोग ऐसा कहते थे, लेकिन आजकल उनकी मार्केटिंग कुछ अलग बता रही है। उन्होंने सालों तक शाखा लगाने से बचने की कोशिश की, क्योंकि वे टास्क या टॉपिक ब्रांच नहीं कर सकते क्योंकि अन्य सिस्टम जैसे कि Git
pablo

2015 में प्रतिक्रिया! शाखा से बचने का कारण विलय करने की आवश्यकता से बचने के लिए है - इसलिए नहीं कि पेरफोर्स में कार्य / विषय शाखा नहीं थी (आप धाराओं में "कार्य शाखा" कर सकते हैं - पेरफोर्स में हम इसे "कार्य धाराओं" कहते हैं। जैसा कि अन्य ने उल्लेख किया है - ब्रांचिंग डीवीसीएस में निहित है और प्रश्न अपरिवर्तनीय हो जाता है। मैं चर्चा करता हूं कि चर्चा केवल उन टूल तक सीमित होनी चाहिए जो क्लाइंट-सर्वर फैशन में काम करते हैं। या डीवीसीएस एक केंद्रीकृत फैशन में उपयोग किया जाता है (2015.1 रिलीज के बाद से आप डीवीसीएस मोड में पेरफोर्स का उपयोग कर सकते हैं। - दोनों दुनिया के सर्वश्रेष्ठ)
लेस्टर चेउंग

2

शाखा लगाने के विभिन्न उद्देश्य हैं:

  1. फ़ीचर / बग शाखाएँ। डायनामिक और सक्रिय शाखाएं जो फीचर / बगफिक्स पूरा होने पर वापस ट्रंक में चली जाती हैं।
  2. स्थैतिक शाखाएँ (सबवर्सन में टैग, हालांकि संक्षेप में एक 'सामान्य शाखा')। वे कहते हैं, एक रिलीज के एक स्थिर स्नैपशॉट प्रदान करते हैं। भले ही उन पर काम किया जा सके , लेकिन वे अछूते नहीं रहे।

1

शाखा लगाने की आवश्यकता भी उत्पन्न हो सकती है:

  • जब आप किसी विशेष ग्राहक को एक हॉटफ़िक्स प्रदान करना चाहते हैं (महत्वपूर्ण कहते हैं) और आप अनिश्चित हैं कि क्या फिक्स भविष्य के रिलीज का हिस्सा होगा


  • 1

    जब भी आपका मन करे।

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

    OTOH, वितरित SCM में शाखा और चेकआउट के बीच कोई तकनीकी अंतर नहीं है, और मर्ज बहुत आसान है। आप एक पूरे बहुत अधिक बार शाखाओं में बंटी की तरह महसूस करेंगे।


    0

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

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


    0

    सभी तकनीकी को एक तरफ छोड़कर .....

    शाखा जब आप वापस विलय करने के लिए अपने आसान पता है!

    यह ध्यान में रखते हुए कि विलय एक परियोजना में कैसे काम किया जाता है, से प्रभावित होगा।

    एक बार यह हासिल करने के बाद अन्य सभी तृतीयक मुद्दे खेलने के लिए आ जाएंगे।

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