Git - मास्टर पर सीधे काम करने से क्या मुद्दे पैदा होते हैं?


25

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

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

इस समय, मैं एक सह-कार्यकर्ता को मना नहीं कर सकता जो सीधे मास्टर पर काम करने के लिए एक बुरा व्यवहार है, लेकिन मैं उन चीजों को समझना चाहूंगा जो उनके काम करने के तरीके से संघर्ष करेंगे, यह जानने के लिए कि मुझे कब फिर से आना चाहिए इस मुद्दे।


2
"सीधे काम" को परिभाषित करें। मास्टर मौजूद है क्योंकि इसका उपयोग किया जाना है। आपको क्या लगता है कि यह किस लिए है और क्या नहीं है?
कैंडिड_ओरेंज 20

3
क्या आपके लिए मास्टर ऑफ वर्किंग काम कर रहा है? यदि यह है, तो आपको अभी बदलने की आवश्यकता क्यों महसूस होती है? यदि यह काम नहीं कर रहा है, तो आपको क्या समस्या है? लोगों से आपको अन्य लोगों के तर्क के लिए कहने के बजाय, हम आपकी समस्याओं को हल करने में आपकी मदद कर सकते हैं।
थॉमस ओवेन्स

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

... कितनी बड़ी टीम है?
ZJR

@MrCochese मैं यहाँ "सामान्य" अर्थ में ट्रंक विकास नहीं कहूंगा। निश्चित रूप से मैंने जितने भी स्थानों का उपयोग किया है उनमें से किसी ने भी इस तरह से काम नहीं किया है, और मैं इसे हतोत्साहित करूंगा। फीचर ब्रांच सिर्फ बेहतर काम करती हैं।
मार्नेन लाईबो-कोसर

जवाबों:


57

कई समस्याएं हैं जब कमिट सीधे मास्टर के लिए धकेल दिए जाते हैं

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

11
अरे देखो! आपने वास्तव में मूल रूप से सभी के विपरीत, इस सवाल का जवाब दिया। ++ SE.SE में आपका स्वागत है!
रबरडुक

इनमें से अधिकांश मास्टर पर प्रत्यक्ष रूप से कार्य से ली गई समस्याएं हैं बुरी तरह से प्रति मास्टर पर सीधे काम करने से, नहीं।
चींटी पी

1
@ अपनी समस्याओं को अपने दृष्टिकोण से रोका जा सकता है?
गेरनोट

10

उसे समझाएं कि नई सुविधाओं के लिए अपनी स्वयं की विकास शाखा की आवश्यकता होती है जिसे उत्पादन के लिए धकेलने से पहले एक परीक्षण वातावरण में तैनात किया जा सकता है।

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

सुविधाओं के लिए स्वतंत्र शाखाओं का उपयोग करने का अर्थ है कि प्रत्येक नई सुविधा का परीक्षण और दूसरों के स्वतंत्र रूप से तैनात किया जा सकता है।


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

@AntP: जिस प्रक्रिया का आप वर्णन कर रहे हैं, वह वह नहीं है जिसे मैं "आधा-पूर्ण सुविधाएँ" कहूंगा। इस तरह की सुविधाओं या तो जांच की जाती है, उत्पादन के लिए तैयार है और प्रयोग करने योग्य हैं, या वे एक फीचर स्विच या ऐसे समय के रूप में वे जब तक कुछ इसी तरह से छुपा रहे हैं कर रहे हैं परीक्षण किया है, उत्पादन के लिए तैयार है और प्रयोग करने योग्य। आप उन विशेषताओं को शिपिंग नहीं कर रहे हैं जो काम नहीं करती हैं।
रॉबर्ट हार्वे

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

1
@AntP: एक चीज़ जो शाखाओं की विशेषता है, जो आपकी तकनीक प्रदान नहीं कर सकती है वह है किसी विशेष सुविधा पर किए गए कार्य का पूरा लेखा-जोखा। कुछ दुकानों में (विशेष रूप से मेरा) उस तरह की जवाबदेही लक्जरी नहीं है, बल्कि एक आवश्यकता है।
रॉबर्ट हार्वे

1
@AntP अगर मैं आपको सही तरीके से समझूं, तो मैं इस पर विचार करूंगा कि एक कदम पीछे की ओर है। मुझे अच्छे अंक ट्रैकर्स से प्यार है, और मैं उन्हें बड़े पैमाने पर उपयोग करता हूं, लेकिन मैं चाहता हूं कि वीसीएस मुझे किसी भी सुविधा या कोड की लाइन का विकास इतिहास बताए । मुद्दा ट्रैकर एक बदलाव के व्यापार पक्ष की कहानी बता सकता है , लेकिन अगर वीसीएस मुझे कोड को ट्रैक करने और ऑडिट करने में मदद नहीं कर सकता है, तो यह अपना काम नहीं कर रहा है। यह एक कारण है कि मैं ट्रंक-आधारित विकास पर आपत्ति करता हूं: यह वीसीएस को बेवकूफ बनाता है, बिना किसी क्षतिपूर्ति लाभ के जिसे मैं देख सकता हूं। : (? इसके अलावा भंगुर युग्मन एक विशेषता है एक कोड परिवर्तन।)
Marnen Laibow-KOSER

2

मास्टर संभावित रूप से भरोसेमंद होना चाहिए। अवधि। मास्टर में कोई भी आधा समाप्त काम नहीं होना चाहिए (जब तक कि एक सुविधा ध्वज के साथ अक्षम न हो)

इसके साथ ही Ive ने देखा कि कुछ टीमें अपने प्रवाह को जटिल कर रही हैं।

जब मास्टर को एकीकृत किया जाता है तो पीआर का उपयोग नहीं करना एक गलती है क्योंकि डेवलपर्स के पास एकीकरण होने पर चुनने की शक्ति नहीं होगी।

एक एकल विकास शाखा बहुत कम मूल्य लाती है। आमतौर पर यह सिर्फ चीजों को उलझाता है। कई फ़ीचर शाखाएँ बहुत अधिक मूल्य लाती हैं।

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

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


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

शायद मैं पूरी तरह से स्पष्ट नहीं था। एक बार एक निर्माण एक पर्यावरण के लिए तैनात किया जाता है। एक ही कलाकृतियों को पुनर्निर्माण के बिना अगले वातावरण में तैनात किया जाना चाहिए।
एसेन स्कोव पेडरसेन

यदि आपके पास दोहराए जाने योग्य बिल्ड हैं, तो इससे कोई फर्क नहीं पड़ता कि आप पुनर्निर्माण करते हैं या नहीं। अगर आपके पास रिपीटेबल बिल्ड नहीं है, तो आपको बड़ी समस्याएं हैं। :)
मार्नेन लाइबो-कोसर

... लेकिन हां, मुझे लगता है कि आपको अपने तैनात किए गए कमेंट्स को टैग करना चाहिए ताकि आप एक ही कोड (चाहे आप पुनर्निर्माण करें) को बढ़ावा दे सकें।
मार्नेन लाईबो-कोसर

हां, लेकिन अधिकांश CI सर्वर बिल्ड से रिलीज को लिंक कर सकते हैं, जिससे तैनाती को ट्रैक करना आसान हो जाता है। जब सेटअप सही ढंग से होता है, तो वास्तव में गिट में तैनाती को ट्रैक करने की आवश्यकता नहीं होती है। गिट एक मैल है। परिनियोजन उपकरण नहीं।
एसेन स्कोव पेडरसेन

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

2

सबसे पहले, मैं यह बताना चाहता हूं कि git में, प्रत्येक pullका शाब्दिक रूप से एक ब्रांचिंग ऑपरेशन है, और हर pushएक मर्ज है। masterएक डेवलपर की मशीन पर से एक पूरी तरह से अलग शाखा है masterएक तकनीकी नजरिए से बराबर खड़े के साथ, आप का हिस्सा एक केंद्रीय रेपो पर। upstreamअगर यह मेरे उद्देश्यों के लिए बेहतर है तो मैं कभी-कभी अपने स्थानीय संस्करण का नाम बदलकर या कुछ और रखूंगा।

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

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

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


1
साथ ही डेवलपर्स को हर दिन उसकी शाखा मशीन को धक्का देना एक अच्छा बैकअप है।
इयान

मुझे आपकी पहली समझ नहीं है। मैं यह नहीं देखता कि एक pullनई शाखा कैसे बनाई जाएगी या pushएक विलय ऑपरेशन कैसे होगा। बल्कि, एक pullहै काफी सचमुच एक fetchएक के बाद merge!
mkrieger1

@ mkrieger1 मैं आसानी से देख सकता हूं कि कैसे स्थानीय masterको एक अलग शाखा माना जा सकता है origin master। तकनीकी रूप से, वे दो अलग-अलग रीमोट पर अलग-अलग शाखाएं हैं, प्रत्येक का अपना इतिहास है।
रबड़डुक

@ रबरडाक हां, बिल्कुल। के साथ pull: इससे पहले: संभावित रूप से अलग-अलग कमिट्स पर इंगित करने वाली दो शाखाएं - आफ्टर: दो शाखाएं समान कमिट्स की ओर इशारा करते हुए - कोई शाखाएं नहीं बनाई गईं, इसलिए मैं इसे "ब्रांचिंग ऑपरेशन" नहीं कहूंगा। यदि दोनों में से कोई भी आदेश देता है, तो मैं उसे कॉल करूंगा push, क्योंकि यह संभावित रूप से रिमोट में एक नई शाखा बनाता है। यह क्या नहीं करता है, एक मर्ज है।
mkrieger1

@ mkrieger1 आपको मर्ज की दिशा पर भी विचार करने की आवश्यकता है ।
रबरडुक

2

अन्य उत्तरों ने पहले से ही मास्टर पर सीधे काम नहीं करने के लिए विभिन्न फायदे (अलग-अलग विशेषताएं, हमेशा मास्टर पर shippable कोड आदि) का उल्लेख किया है।

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

क्या आपके पास फीचर शाखाएं हैं, जो मास्टर में विलय हो गई हैं या क्या आपके पास अलग-अलग रिलीज शाखाएं हैं या आप पूरी तरह से अलग प्रक्रिया का उपयोग करते हैं?

"मास्टर शाखा का उपयोग न करें" पर्याप्त नहीं है।


2

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

यह मुझे विश्वास दिलाता है कि अधिक मुद्दे हैं। मास्टर पर काम करना या न करना ज्यादातर बड़े दर्शन का हिस्सा है कि आप उत्पादों को कैसे, क्या और कब जारी करते हैं।

तो "एक मास्टर के साथ आपको कभी काम नहीं करना चाहिए" के साथ मिलकर, क्या आपके पास सुविधाओं का परीक्षण है, क्या आप प्रत्येक-दूसरों के काम का परीक्षण करते हैं क्या आप प्रत्येक-दूसरों के कोड की समीक्षा करते हैं। स्वीकृति और एकीकरण परीक्षण।

यदि आपके पास उपरोक्त में से कोई भी नहीं है और आप इसे केवल "गिट" करने के लिए कर रहे हैं, तो आप मास्टर पर भी काम कर सकते हैं।


1

शाखा पर सीधे काम करने के आसपास कोई "बुरा अभ्यास" नहीं है। लेकिन आपको यह तय करना होगा कि आपकी प्रक्रिया का सबसे अच्छा समर्थन क्या है:

प्रश्न 1: क्या आपके मास्टर को आपके सॉफ़्टवेयर की वर्तमान रिलीज़ स्थिति का प्रतिनिधित्व करना चाहिए? फिर आपको एक वैश्विक विकास शाखा शुरू करनी चाहिए और एक रिलीज के विकास के अंत में विकास को मर्ज करना चाहिए।

प्रश्न 2: क्या आप एक कोड समीक्षा प्रक्रिया करना चाहते हैं? फिर आपके पास "सुविधा शाखाएं" होनी चाहिए जो कि मास्टर में विलय कर दी जाएंगी (या विकसित करें, यदि आपके पास एक है) पुल अनुरोधों के माध्यम से।

प्रश्न 3: क्या अन्य डेवलपर्स के लिए मध्यवर्ती कोड राज्य को साझा करने की आवश्यकता है जिन्हें अभी तक उत्पादन (या परीक्षण) में प्रकाशित नहीं किया जाना चाहिए? यही कारण है कि एक से अधिक डेवलपर एक सुविधा विकसित करते हैं। फिर आपको "सुविधा शाखाएं" शुरू करनी चाहिए।


टैग रिलीज़ होने पर कोड बेस की स्थिति का प्रतिनिधित्व करने के लिए एक बहुत व्यवहार्य तरीका है। Git एक विशिष्ट टैग को जांचना बहुत आसान बनाता है। देव शाखा एक प्रकार की मूट बनाता है।
रबरडुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.