2012-11-07 11 views
14

हम हमारी टीम में इस प्रकार के रूप में काम में bugfixes backport रहे हैं:Git रणनीति बड़े शाखाओं (चेरी ले बनाम मर्ज)

  • हम अपने GitHub रेपो में केवल एक master शाखा है, यह स्थिर नहीं है - सोचता है कि मिल हर दिन वहां धक्का दिया; स्थिर रिलीज के लिए हम टैग का उपयोग करते हैं (विकास के लिए, हम गिटहब पर निजी कांटे का उपयोग करते हैं)
  • हम हर 3 सप्ताह में एक नया मामूली संस्करण जारी करते हैं, जिसमें बगफिक्स और नई विशेषताएं होती हैं (1.2.4, 1.2.5, 1.2.6 कहें। ..)
  • हमें प्रत्येक मामूली पुराने संस्करण को सीमित समय (कुछ महीनों) के लिए भी बनाए रखना है, इसलिए जब कोई 1.2.4 का उपयोग करता है, जबकि नवीनतम संस्करण 1.2.7 है, और उन्हें एक बग मिलती है, तो वे एक बग पा सकते हैं हमारे द्वारा उपयोग की जाने वाली शाखा पर बग को ठीक करने का अनुरोध करें। फिर हम पैच संस्करण, 1.2.4 ए जारी करते हैं।
  • पैच बल्कि असाधारण हैं। हम आम तौर पर मामूली रिलीज के लिए 1-2 से अधिक पैच नहीं करते हैं। अधिकांश रिलीज के लिए हम पैच नहीं करते हैं।

सवाल यह है कि, मास्टर और पुरानी शाखा पर एक ही समय में बग को ठीक करने की सबसे अच्छी रणनीति क्या है?

मैं दो मुख्य रणनीतियों के बारे में सोच सकते हैं:

  1. master पर बग को ठीक करें, तो चेकआउट v1.2.4, तो चेरी लेने उचित बग सुधार के लिए प्रतिबद्ध (मान लीजिए एक प्रतिबद्ध जो हमेशा रखती है) और परिणामी प्रतिबद्धता को v1.2.4A के रूप में टैग करें।

  2. चेकआउट v1.2.4,, बग को ठीक करें और पुष्टि को टैग v1.2.4A के रूप में प्रतिबद्ध है, और master करने के लिए इसे शामिल करने के लिए, एक मर्ज है।

मैं पहले संस्करण (चेरी-पिकिंग) के पक्ष में हूं, लेकिन मैं पेशेवरों और विपक्ष के बारे में अन्य टिप्पणियां सुनना चाहता हूं।

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

लाभ:

  • मुझे लगता है कि इतिहास अधिक चेरी पिकिंग के साथ "खाने योग्य है।" इस पर विचार करें:

    | <- bugfix done on master 
    | 
    | 
    | <- v1.2.7 
    ... 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    | - <- v.1.2.4A (cherry-picked from master) 
    |/
    | <- v1.2.4 
    

    इस बनाम:

    | <- bugfix merged to master 
    |\ 
    | \ 
    | | 
    | | <- v1.2.7 
    ... 
    | | 
    | | 
    | | 
    | | 
    | | 
    | | 
    | | 
    | | 
    | | 
    | - <- v.1.2.4A (direct bugfix) 
    |/
    | <- v1.2.4 
    

    के बीच में प्रतिबद्ध के दर्जनों होने के Think। समानांतर में इस तरह के कई पैच लागू करने पर विचार करें। स्क्रीन का आधा प्रदूषित हो जाएगा।

  • मान लें कि मैंने v1.2.4 पर कोई समस्या तय की है, लेकिन कुछ दिनों में कोई मुझे v1.2.3 पर पैच के लिए पूछता है। चेरी-पिक इसे करने का सबसे समझदार तरीका है।

क्या हमारे मामले में विलय करने के कोई फायदे हैं जिन्हें मैंने अनदेखा किया? मैं समझ सकता हूं कि यह दोनों चेरी-पिकिंग से बेहतर काम करता है, लेकिन हम रिलीज के दस्तावेज रखते हैं और यह सब भी वहां ट्रैक किया जाता है।

+0

चेरी-पिकिंग दोनों दिशाओं में किया जा सकता है। – madth3

+0

हाँ, सच है, मैं मुख्य रूप से चेरी-पिक बनाम विलय के लाभों के बारे में पूछता हूं। इस बारे में कि क्या पुराने से बैकपोर्ट के रूप में मास्टर से चेरी-चुनना है, या पुराने से मास्टर तक, दूसरी कहानी है। मुझे लगता है कि बैकपोर्टिंग अधिक तार्किक है और इस तरह मैंने इसे विभिन्न परियोजनाओं में किया है। लेकिन यह दार्शनिक सवाल है। '-x' के लिए –

उत्तर

17

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

चेरी उठा इस स्थिति में, तो आप शायद -x ध्वज का उपयोग करना चाहते हैं: जब रिकॉर्डिंग प्रतिबद्ध

, एक लाइन "(चेरी प्रतिबद्ध से उठाया ...)" का कहना है कि करने के लिए संलग्न के लिए मूल प्रतिबद्ध संदेश इंगित करता है कि इस परिवर्तन को किस चेरी से चुना गया था। यह केवल बिना किसी संघर्ष के चेरी चुनने के लिए किया गया है। ... [यदि] आप दो सार्वजनिक रूप से दिखाई देने वाली शाखाओं के बीच चेरी-पिकिंग कर रहे हैं (उदा। से एक विकास शाखा से पुरानी रिलीज के लिए रखरखाव शाखा में एक फिक्स का समर्थन करना), यह जानकारी उपयोगी हो सकती है।

+4

+1 (क्योंकि मैंने आरटीएफएम नहीं किया था :) –

+0

यह भी ध्यान दें कि:' -r' यह उपरोक्त वर्णित '-x' करने के लिए डिफ़ॉल्ट आदेश दिया गया था, और -r इसे अक्षम करना था । अब डिफ़ॉल्ट '-x' नहीं करना है, इसलिए यह विकल्प नो-ऑप है। –

+0

मैं उन परियोजनाओं के लिए अनुशंसा करता हूं जहां अधिकांश उपयोगकर्ता मास्टर या क्लोज़ पर रहते हैं। – sevo

6

आपकी रणनीति 2, पहले रिलीज शाखा पर बग को ठीक करने के लिए, उदाहरण के लिए v1.2.4 और फिर अपने विकास ट्रंक करने के लिए कि परिवर्तन विलय, gitworkflows(7) ने सुझाव दिया जाता है:

नियम: विषय शाखाओं

हर विषय (फीचर, बग सुधार, ...) के लिए एक पक्ष शाखा करें। इसे सबसे पुरानी एकीकरण शाखा में फेंक दें जिसे आप अंततः इसमें विलय करना चाहते हैं।

एकीकरण शाखा में सुविधा/बग सुधार के लिए, बस यह विलय:

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

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

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

दोनों रणनीतियों व्यवहार्य हैं और प्रत्येक के लिए लाभ हैं।

+0

उपरोक्त। क्या होगा अगर बग अपरिवर्तनीय है, वैकल्पिक सुविधा की सिफारिश की जाती है या सॉफ़्टवेयर मास्टर पर अलग-अलग व्यवहार करता है? उन मामलों में यह मास्टर पर ठीक करने के लिए शून्य समझ में आता है। लिनक्स के लिए, पीछे की संगतता महत्वपूर्ण है इसलिए चेरी-पिक दृष्टिकोण ठीक है। – sevo

संबंधित मुद्दे