क्या इस गिट ब्रांचिंग मॉडल के साथ कोई दोष है?


10

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

(आपको हर सवाल का जवाब देने की जरूरत नहीं है, जो कुछ भी आप मददगार हो सकते हैं)

  1. क्या आप इसका उपयोग करते हैं या इसी तरह की गिट ब्रांचिंग वर्कफ़्लो?

  2. क्या आप इसे एक उत्पादक दृष्टिकोण मानते हैं?

  3. क्या आप इस दृष्टिकोण के साथ कोई दोष देखते हैं? किसी भी संभावित नकारात्मक पक्ष?

  4. यदि आपके पास एक बेहतर दृष्टिकोण है, तो क्या आप इसे साझा करने, या इसके बारे में एक लेख या चर्चा के लिए लिंक प्रदान करने का मन करेंगे?

जवाबों:


6

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

सबसे पहले, विचार की दो स्कूल हैं जब यह सुविधा शाखाओं की बात आती है:

  1. उन्हें मर्ज करें
  2. उन्हें रिबास करें

(१) वह लेख जो सुझाव देता है। मर्ज कमिट्स की समस्या तथाकथित ईविल मर्ज है । विशेष रूप से, वे जो विकास के रास्तों से जुड़ते हैं जहां एक फ़ंक्शन ने किसी एक शाखा में शब्दार्थ को बदल दिया है, लेकिन स्वचालित विलय अन्य शाखा से आने वाले कोड में सभी घटनाओं को पैच करने में विफल रहता है। इस तरह की शुरूआत ने डिबग करने के लिए कुख्यात रूप से कठिन हैं। जीआईटी उपयोगकर्ता के रूप में, आप आमतौर पर प्रतिगमन के बारे में बहुत अधिक आराम कर सकते हैं, क्योंकि आपको git bisectउनके कारणों को स्वचालित रूप से ढूंढना होगा। हालांकि, वर्णित स्थिति में, git bisectमर्ज कमिट को इंगित करेगा, जो आपको बिल्कुल भी मदद नहीं करता है।

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

व्यक्तिगत रूप से, मैं दृढ़ता से शिविर (2) में हूं, क्योंकि मैं git bisectपरीक्षण कवरेज के संभावित नुकसान से अधिक परिणामों की वैधता को महत्व देता हूं , जिसे उचित सीआई प्रणाली का उपयोग करके आसानी से मुआवजा दिया जाता है।

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

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


+1, कभी भी एक मंचन भंडार के बारे में नहीं सुना है जिसे खरोंच कहा जाता है, लेकिन मुझे लगता है कि यह "खरोंच से शुरू" होगा :-)
स्पोइक

@ रीनह्रीक: क्या आप शांत रह सकते हैं और इस बारे में बहस कर सकते हैं कि आप
रिबासिंग से

2
माफ़ करना। Git bisect समस्या का दावा किया गया है कि मौजूद नहीं है। Git bisect मर्ज कमिट्स में bisect कर सकता है। डेवलपर्स (या सामयिक शाखाओं) की संख्या बढ़ने के कारण एक रेखीय इतिहास को बनाए रखना मुश्किल हो जाता है। इसके अलावा, ब्रांचिंग और मर्जिंग द्वारा, आप एक बहुत शक्तिशाली वर्कफ़्लो टूल और पहली जगह में गिट का उपयोग करने के मुख्य लाभों में से एक को खो देते हैं। आपको "डेवलपर्स के बीच धक्का" नहीं है, आप प्रत्येक डेवलपर के लिए एक दूरस्थ, सार्वजनिक (डेवलपर टीम के भीतर, कम से कम) रिपॉजिटरी सेट कर सकते हैं। ऐसा करना आसान है। आप जो अनिवार्य रूप से वर्णन कर रहे हैं वह svn जैसे git का उपयोग कर रहा है।
हेन हेनरिक्स

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

1
@ReinHenrichs mmutz का वर्णन करने वाले "दुष्ट मर्ज" का git bisectअकेले से कोई लेना-देना नहीं है । यह तब होता है जब फीचर ए एक फ़ंक्शन को बदलता है जो बी का उपयोग करता है। सभी परीक्षण मर्ज से पहले A और B दोनों में गुजरेंगे, लेकिन मर्ज परीक्षण A और B के बीच असंगत परिवर्तनों के कारण टूट सकते हैं - लेकिन git bisectआंशिक रूप से एक शाखा को दूसरे में लागू नहीं कर सकते हैं, इसलिए इसका एकमात्र संकेत यह है कि मर्ज कमिट जब बग को पेश किया गया था।
इज़काता

2

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

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

मैं से परिवर्तन विलय के खिलाफ फैसला किया है masterमें toolkit-conversionशाखा है, क्योंकि यह यह बहुत कठिन पहले प्रतिबद्ध rebase करने के लिए शाखा स्वच्छ और समीक्षा करने के लिए आसान रखने के लिए होगा। इसके अलावा, मर्ज संघर्षों को पेश कर सकते हैं जिनके संकल्प एक साफ इतिहास रखते समय स्पष्ट नहीं हैं।

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

अंत में, मेरी toolkit-conversionशाखा संक्षिप्त, साफ और समीक्षा में आसान रहती है। मैं कल्पना नहीं कर सकता था कि यह ऐसा ही शक्तिशाली है, जैसे, एसवीएन।


2

वर्तमान में मैं जिस कंपनी में काम कर रहा हूं, हम कुछ समय के लिए इसी ब्रांचिंग मॉडल की भिन्नता लागू कर रहे हैं। हम भी स्क्रैम का उपयोग कर रहे हैं इसलिए हम प्रति कहानी वर्कफ़्लो एक शाखा करते हैं।

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

इसके अलावा, यह विश्वसनीय साबित हुआ है :)।


1

मैं वर्तमान में इस वर्कफ़्लो को अपनाने में व्यस्त हूं। मुझे लगता है कि यह काफी अच्छा वर्कफ़्लो है, क्योंकि यह ब्रांचिंग मॉडल का उपयोग करता है जहाँ git excels इन है।

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

कोहन के डेवलपर्स भी इस वर्कफ़्लो का उपयोग करते हैं, और वे इसे काफी पसंद करते हैं।


1

क्या आप इसका उपयोग करते हैं या इसी तरह की गिट ब्रांचिंग वर्कफ़्लो?

हम काम पर एक समान वर्कफ़्लो का उपयोग करते हैं, लेकिन थोड़ा कम जटिल है। हालाँकि यह इस वर्कफ़्लो से बहुत प्रेरित है, क्योंकि मैंने इस लेख को कई बार पढ़ा है। मैं भी अपने डेस्क के पास रंगों में मुद्रित शाखाओं वाले मॉडल की pdf है :)

क्या आप इसे एक उत्पादक दृष्टिकोण मानते हैं?

उत्पादक। आप उत्पादकता को कैसे परिभाषित करते हैं? वैसे, मेरे दिमाग में हर समय उच्च गुणवत्ता का होना, कम से कम कोशिश करना और बेहतर गुणवत्ता हासिल करना सबसे महत्वपूर्ण है। लगातार प्रक्रिया में सुधार करना आदि। यदि आप गुणवत्ता कोड का उत्पादन कर सकते हैं, तो उत्पादकता से लाभ होगा। तो सवाल वास्तव में है: क्या यह सॉफ्टवेयर की गुणवत्ता में सुधार करता है? और उस पर मेरा जवाब निश्चित रूप से हाँ है।

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

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

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

क्या आप इस दृष्टिकोण के साथ कोई दोष देखते हैं? किसी भी संभावित नकारात्मक पक्ष?

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

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

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

यदि आपके पास एक बेहतर दृष्टिकोण है, तो क्या आप इसे साझा करने, या इसके बारे में एक लेख या चर्चा के लिए लिंक प्रदान करने का मन करेंगे?

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

सबसे महत्वपूर्ण बात यह है कि शुरुआत गित से करें और बाकी स्वाभाविक रूप से पालन करेंगे। सरल शुरू करें और धीरे-धीरे सुधार करें! रचनात्मक बनो!

चियर्स

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