छोटे देव दल के लिए गिट शाखा की रणनीति [बंद]


186

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

क्या किसी के पास छोटी टीमों के लिए पसंदीदा पसंदीदा शाखा रणनीति है जो निम्नलिखित आवश्यकताओं को पूरा करती है:

  1. 2 से 3 डेवलपर्स की टीमों के लिए अच्छा काम करता है
  2. लाइटवेट, और बहुत अधिक प्रक्रिया नहीं
  3. देगों को बग फिक्स और बड़ी सुविधाओं पर काम को आसानी से अलग करने की अनुमति देता है
  4. हमें एक स्थिर शाखा रखने की अनुमति देता है (उन 'ओह बकवास' क्षणों के लिए जब हमें अपने उत्पादन सर्वर को काम करना होता है)

आदर्श रूप से, मैं एक नए बग पर काम करने वाले देव के लिए आपकी चरण-दर-चरण प्रक्रिया देखना पसंद करूंगा

जवाबों:


247

आपको प्रो स्कॉट में वर्णित वर्कफ़्लो स्कॉट चाकोन से लाभ हो सकता है । इस वर्कफ़्लो में, आपकी दो शाखाएँ होती हैं जो हमेशा मौजूद रहती हैं, मास्टर और विकसित होती हैं

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

विकास में वे परिवर्तन हैं जो प्रगति पर हैं और जरूरी नहीं कि उत्पादन के लिए तैयार हों।

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

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

कदम दर कदम, इस मॉडल के तहत आपका वर्कफ़्लो इस तरह दिख सकता है:

  1. आपको एक बग को ठीक करने की आवश्यकता है।
  2. माईफिक्स नामक एक शाखा बनाएं जो कि विकसित शाखा पर आधारित हो ।
  3. इस विषय शाखा में बग पर तब तक काम करें जब तक यह तय न हो जाए।
  4. मायफिक्स को विकसित करने में मर्ज करें । परीक्षण चलाएं।
  5. आप किसी अन्य विषय शाखा के साथ अपना समाधान संघर्ष की खोज hisfix कि अपने सहकर्मी में विलय का विकास जब आप अपने को ठीक करने पर काम कर रहे थे।
  6. इन संघर्षों से निपटने के लिए myfix ब्रांच में और बदलाव करें ।
  7. मर्ज myfix में विकसित करने और चलाने परीक्षण फिर से।
  8. सब कुछ ठीक काम करता है। मर्ज मास्टर में विकसित
  9. किसी भी समय मास्टर से उत्पादन करने के लिए तैनात करें , क्योंकि आप जानते हैं कि यह स्थिर है।

इस वर्कफ़्लो पर अधिक जानकारी के लिए, प्रो गिट में ब्रांचिंग वर्कफ़्लोज़ अध्याय देखें।


7
इसके अलावा स्कॉट चाकोन ने अपनी साइट पर एक उत्कृष्ट लेख दिया है कि गिट के साथ गिटब
program247365

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

5
क्या होगा अगर हम 2 अलग-अलग विशेषताओं को विकसित कर रहे हैं, F1 और F2, जहां F1 को एक सप्ताह में रिलीज़ किया जाना है लेकिन F2 को 2 सप्ताह में रिलीज़ किया जाना है, यह मानते हुए कि F1 और F2 का विकास होता है? उस पर कोई सुझाव?
मुरत दरिया

4
developएक अनावश्यक एक समस्या के लिए 'समाधान' Git नहीं है कि है। जहाँ तक मैं बता सकता हूँ कि सफलता एक अच्छी तरह से लिखे जाने के कारण है यदि कोई गलत टिप्पणी वाला लेख अनुमति नहीं है। यहाँ एक काउंटर-लेख barro.github.io/2016/02/…
टिम एबेल

5
चरण 8 में, विकसित शाखा को मास्टर में विलय करने से यह लगता है कि एक बुरा विचार दिया गया है कि विकास में कुछ कोड उत्पादन में जाने के लिए तैयार नहीं हो सकते हैं। क्या हम सुविधा शाखा को मास्टर में विलय करने से बेहतर नहीं होंगे?
टॉड

45

नौसिखिए के रूप में आने के बाद एक सीधे-आगे की रणनीति खोजने की कोशिश कर रहे अन्य देवों को सिखाने के लिए जिन्होंने कभी स्रोत नियंत्रण का उपयोग नहीं किया। यह वह है जो http://nvie.com/posts/a-successful-git-branching-model/ फिट है, मैंने मैन पेजों में मानक GIT वर्कफ़्लो thats का उपयोग करने की कोशिश की, लेकिन इसने मुझे थोड़ा भ्रमित किया और मेरे दर्शकों को पूरी तरह से।

पिछले 6 महीनों में मुझे केवल दो बार संघर्षों को ठीक करना पड़ा है। मैंने मर्ज के बाद हमेशा परीक्षण करने और 'लाने और मर्ज करने' या 'पुल - क्रेब "को बहुत (एक बार सुबह और दोपहर में) सुविधाओं को विकसित करने के दौरान कदम जोड़ा है। हमने नवीनतम कोड को खींचने के लिए केंद्रीय स्थान के रूप में github.com का भी उपयोग किया।


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

आह, तो यह वह जगह है जहाँ मुझे वह लिंक मिला :-) मैंने अपनी पहली Git परियोजना को स्थापित करने से पहले कई Git रणनीतियों को देखा था (मैं SCCS से CVS से SVN में वर्षों से चली गई हूं और अब मैं एक नई परियोजना के लिए Git आज़माना चाहती हूं ) और यह वह था जिसने मुझे सबसे अधिक समझ में आया। मैं आपके पोस्ट को पहचानता हूं, इसलिए मुझे यकीन है कि यह वह जगह है जहां मैंने इसे पाया है। तो धन्यवाद - यह बहुत अच्छी तरह से काम करता है!
Boise

4
मैं हर बार थोड़ा अंदर मर जाता हूं, मैं देखता हूं कि कोई व्यक्ति उस ब्लॉग पोस्ट को उठाएगा। यहाँ एक खंडन है: barro.github.io/2016/02/…
टिम एबेल

मैं उसी भावना को आपके साथ साझा करता हूं @TimAbell; मुझे दृढ़ता से यह सही नहीं लगता है जब इसका default master branchउपयोग सबसे अधिक बार किया जाता है, इसमें डेवलपर नहीं हैंA successful Git branching model
Nam G VU

35

(मेरी टिप्पणी ऊपर दी गई है यह स्वयं का उत्तर है, जैसा कि मुझे शुरू में होना चाहिए था।)

गितुब के स्कॉट चाकोन से:

हम यह कैसे करते हैं, GitHub फ्लो क्या है?

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

अधिक जानकारी के लिए पूरा लेख देखें: http://scottchacon.com/2011/08/31/github-flow.html

ध्यान दें कि "पुल अनुरोध" एक गीथब आविष्कार है, और यह कुछ ऐसा है जो उनकी वेबसाइट में बेक किया गया है, न कि खुद गिट: https://help.github.com/articles/use-pull-requests/


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

@ Squadrons लगता है कि आप के लिए ऑक्टोपस की जरूरत है, कि गेट्स के लिए बनाया गया है ठीक है / इनकार विभिन्न वातावरणों पर हो रही बनाता है और इस तरह की चीजों के साथ अपने स्रोत नियंत्रण को प्रदूषित नहीं करता है।
टिम एबेल

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

15

masterअपनी विकास शाखा के रूप में शाखा का उपयोग करें और बग फिक्स करने के लिए रिलीज शाखाएं बनाएं।

कोई भी नई सुविधा masterविकास विंडो के दौरान आगे बढ़ेगी (या तो सीधे-सीधे या विषय-शाखाओं के रूप में, आपके लिए - ग्राफिक में नहीं दिखाया गया है)। एक बार आपकी सभी नियोजित सुविधाएँ लागू हो जाने के बाद, फ़ीचर फ़्रीज़ दर्ज करें, और परीक्षण करें। जब आप खुश हों, तो रिलीज़ को इस masterरूप में टैग करें v1.0

समय के साथ आपके उपयोगकर्ता बग ढूंढ v1.0लेंगे , इसलिए आप उस टैग से एक शाखा बनाना चाहेंगे (उदाहरण के लिए इसे रिलीज़ होने के बाद नाम दें 1.0) और शाखा में उन बगों को ठीक करें। जब आपको पर्याप्त बग्स तय हो जाते हैं कि आपको लगता है कि यह एक नई रिलीज़ को वारंट करता है तो इसे टैग करें v1.0.1और इसे वापस मर्ज करें master

इस बीच एक नई विकास खिड़की masterशाखा पर हो रही है जिसे अंततः टैग किया जाएगा v1.1

कुल्ला और दोहराएँ।

यह सिमेंटिक वर्जन नंबरिंग लॉजिक इस प्रकार है।

 ---------(v1.0)--------------------------------(v1.1)-----------------------------> master
             \                                     \  
              ---(v1.0.1)---(v1.0.2)---> 1.0        ---(v1.1.1)---(v1.1.2)---> 1.1

5
अपने 1.0.1बदलावों को वापस मर्ज करना न भूलेंmaster
kwahn

और हमेशा 1.1मर्ज करने के बाद मास्टर पर छूट देने का ध्यान रखें 1.0.1- यह विश्वास को कम करने में मदद करता है।
नाम जी वीयू

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

1
नहीं, रिलीज शाखाओं को मास्टर में वापस मर्ज न करें! यह आपको सभी प्रकार के सिरदर्द दे सकता है, जिनकी आपको आवश्यकता नहीं है (केवल रिलीज में सामान विलय करना, नए रिलीज के साथ विलय करना, बिल्ड ब्रेक करना, गैर-रैखिक इतिहास, आदि) मेरा विश्वास करो, मैंने देखा है कि यह एक से अधिक बार होता है) । इसके बजाय, कांटे के रूप में रिलीज का इलाज करें। देखें bitsnbites.eu/a-stable-mainline-branching-model-for-git
एम-bitsnbites

4
चेरी-पिक मास्टर में रिलीज़ परिवर्तन को पुनः प्राप्त करने के लिए एक बेहतर विकल्प है
बार्टोज़कपी

4

VCS में, केवल एक "मास्टर" शाखा होने से इसकी सीमाएं जल्दी से दिखाई देती हैं क्योंकि आप एक ही समय में एक ही समय में सभी विकास प्रयासों को आगे नहीं बढ़ा सकते हैं।
इसका मतलब है कि आपको पता होना चाहिए कि कब शाखा लगानी है

लेकिन एक डीवीसीएस (जैसा कि "विकेन्द्रीकृत" वीसीएस में), आपके पास एक प्रकाशन समस्या भी है , जिसकी शाखाओं के साथ आप अपने रिपॉजिटरी में स्थानीय रखते हैं, और जिन शाखाओं को आप धक्का दे रहे हैं या जिनसे आप खींच रहे हैं।

इस संदर्भ में, अपने समवर्ती विकास प्रयास की पहचान करके शुरू करें, और एक प्रकाशन (पुश / पुल) प्रक्रिया पर निर्णय लें। उदाहरण के लिए (और यह एकमात्र तरीका नहीं है):

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

अन्य रिलीज़ प्रबंधन प्रक्रियाएँ मौजूद हैं, क्योंकि यह SO प्रश्न उपस्थित होता है ।


3

फुर्तीली टीमों के लिए रेइनह के गिट वर्कफ्लो के माध्यम से यहां पढ़ें: http://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html

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

नोट: यह रणनीति शायद ही विशिष्ट है, लेकिन गिट इस रणनीति को लागू करना बहुत आसान बनाता है।

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