गेट चेरी-पिक बनाम मर्ज वर्कफ्लो


302

यह मानते हुए कि मैं एक रेपो का अनुचर हूं, और मैं एक योगदानकर्ता से बदलावों को खींचना चाहता हूं, कुछ संभावित वर्कफ़्लो हैं:

  1. मैं cherry-pickप्रत्येक रिमोट (आदेश में) से प्रतिबद्ध हूं । इस मामले में git रिमोट ब्रांच से असंबंधित कमिटमेंट को रिकॉर्ड करता है।
  2. मैं mergeशाखा, सभी परिवर्तनों में खींच रहा हूं , और एक नया "संघर्ष" प्रतिबद्ध (यदि आवश्यक हो) जोड़ रहा हूं ।
  3. मैं mergeप्रत्येक को दूरस्थ शाखा से अलग-अलग (फिर से क्रम में) प्रतिबद्ध करता हूं , संघर्षों को एक साथ समूहीकृत करने के बजाय प्रत्येक प्रतिबद्ध के लिए दर्ज करने की अनुमति देता है।
  4. पूर्णता के लिए, आप एक rebase( cherry-pickविकल्प के रूप में एक ही ?) कर सकते हैं, हालांकि मेरी समझ यह है कि यह योगदानकर्ता के लिए भ्रम पैदा कर सकता है। हो सकता है कि विकल्प 1 को समाप्त कर दे।

2 और 3 दोनों मामलों में, git 1 के विपरीत, कमिट्स के ब्रांच हिस्ट्री को रिकॉर्ड करता है।

वर्णित cherry-pickऔर mergeविधियों के उपयोग से प्रो और कोन के बीच क्या हैं ? मेरी समझ यह है कि विधि 2 आदर्श है, लेकिन मुझे लगता है कि एक एकल "संघर्ष" मर्ज के साथ एक बड़ी प्रतिबद्धता को हल करना सबसे साफ समाधान नहीं है।

जवाबों:


296

दोनों rebase(और cherry-pick) और mergeउनके फायदे और नुकसान हैं। मैं mergeयहां तर्क देता हूं , लेकिन यह दोनों को समझने लायक है। (एक वैकल्पिक, अच्छी तरह से तर्क जवाब देने वाले मामलों के लिए यहां देखें जहां rebaseप्राथमिकता दी जाती है।)

mergeअधिक पसंद किया जाता है cherry-pickऔर rebaseकारणों की एक जोड़ी के लिए।

  1. लूटने का काम । एक कमेटी का SHA1 पहचानकर्ता इसे न केवल अपने और बल्कि अन्य सभी के संबंध में पहचानता है जो इसे पूर्ववर्ती मानते हैं। यह आपको एक गारंटी देता है कि किसी दिए गए SHA1 पर भंडार की स्थिति सभी क्लोनों के समान है। वहाँ (सिद्धांत रूप में) कोई मौका नहीं है कि किसी ने किया है जो एक ही बदलाव की तरह दिखता है, लेकिन वास्तव में आपके भंडार को भ्रष्ट या अपहरण कर रहा है। आप अलग-अलग परिवर्तनों में चेरी-पिक कर सकते हैं और वे समान होने की संभावना है, लेकिन आपके पास कोई गारंटी नहीं है। (एक मामूली गौण मुद्दे के रूप में, नए चेरी से चुने गए कमिट अतिरिक्त स्थान ले लेंगे, अगर कोई और चेरी-पिक्स फिर से एक ही प्रतिबद्ध करता है, क्योंकि वे दोनों इतिहास में मौजूद रहेंगे, भले ही आपकी कार्य प्रतियां समान हों।)
  2. उपयोग में आसानी । लोग mergeवर्कफ़्लो को काफी आसानी से समझ लेते हैं। rebaseअधिक उन्नत माना जाता है। दोनों को समझना सबसे अच्छा है, लेकिन जो लोग संस्करण नियंत्रण में विशेषज्ञ नहीं होना चाहते हैं (जिसमें मेरे अनुभव में कई सहयोगियों को शामिल किया गया है जो वे क्या करते हैं, पर बहुत अच्छे हैं, लेकिन अतिरिक्त समय बिताना नहीं चाहते हैं) एक आसान है समय बस विलय।

मर्ज-हेवी वर्कफ़्लो के साथ rebaseऔर cherry-pickविशेष मामलों के लिए अभी भी उपयोगी हैं:

  1. mergeइतिहास से एक उलटा है। rebaseआपके इतिहास में बिखरे होने से होने वाली कमियों की एक लंबी श्रृंखला को रोकता है, जैसे कि यदि आप समय-समय पर दूसरों के परिवर्तनों में विलीन हो जाते हैं। यह वास्तव में इसका मुख्य उद्देश्य है क्योंकि मैं इसका उपयोग करता हूं। आप जिस चीज से बहुत सावधान रहना चाहते हैं , वह यह है rebaseकि आप कभी भी अन्य रिपॉजिटरी के साथ साझा नहीं करें। एक बार pushएड होने के बाद कोई दूसरा व्यक्ति इसके ऊपर प्रतिबद्ध हो सकता है, और रिबासिंग सबसे अच्छा कारण होगा जिस तरह की नकल ऊपर चर्चा की गई है। सबसे बुरी तरह से आप एक बहुत ही भ्रमित रिपॉजिटरी और सूक्ष्म त्रुटियों के साथ समाप्त हो सकते हैं यह आपको फेर्रेट करने में लंबा समय लगेगा।
  2. cherry-pick मूल रूप से त्यागने का निर्णय लिया गया विषय शाखा से परिवर्तनों के एक छोटे उपसमूह का नमूना लेने के लिए उपयोगी है, लेकिन एहसास हुआ कि कुछ उपयोगी टुकड़े हैं।

के रूप में एक से अधिक परिवर्तन विलय पसंद करते हैं: यह सिर्फ एक बहुत सरल है। एक बार जब आप उनमें से बहुत से होने लगते हैं तो व्यक्तिगत परिवर्तनों का विलय करना बहुत थकाऊ हो सकता है। Git (और Mercurial, और Bazaar में) में मर्ज रिज़ॉल्यूशन बहुत अच्छा है। आप ज्यादातर समय लंबी शाखाओं में विलय करने वाली प्रमुख समस्याओं में नहीं चलेंगे। मैं आम तौर पर सब कुछ एक ही बार में मर्ज कर देता हूं और अगर मुझे बड़ी संख्या में संघर्ष मिलते हैं तो मैं वापस आ जाता हूं और मर्ज के टुकड़े को फिर से चलाता हूं। फिर भी मैं इसे बड़े चाव से करता हूं। एक बहुत ही वास्तविक उदाहरण के रूप में, मेरे पास एक सहकर्मी था, जिसके पास विलय के लिए 3 महीने का मूल्य था, और 250000 लाइन कोड-बेस में कुछ 9000 संघर्ष हुए। हमने जो ठीक करने के लिए किया था वह एक बार में एक महीने के मूल्य को मर्ज करने के लिए है: संघर्ष रैखिक रूप से नहीं बनता है, और इसे टुकड़ों में करने से परिणाम होता है दूर होता है9000 से कम संघर्ष। यह अभी भी बहुत काम था, लेकिन एक समय में इसे कमिट करने के लिए उतना प्रयास नहीं किया गया।


1
दरअसल, सिद्धांत रूप में एक मौका है कि मैलोरी एक ही SHA1 लेकिन अलग-अलग सामग्री के साथ कमिट बनाकर आपकी रिपॉजिटरी को भ्रष्ट कर सकती है, यह शायद अभ्यास में कभी नहीं होगा। :)
बॉम्बे

1
हा :) मेरा मतलब था "सिद्धांत में अंतर इतना कम है कि आप इस पर भरोसा नहीं कर सकते हैं" नहीं, लेकिन आप सही हैं कि यह टॉपसी-टर्वी पढ़ता है।
क्वार्क

आप "मर्ज - स्क्वैश" के बारे में क्या सोचते हैं?
सेमीकिन्टी

@ बॉम्बे अगर मल्लोरी सफल होना चाहती है तो उसे विशेष रूप से मूल कमेटी और उसी एसएचए 1 के साथ दूसरी कमिटमेंट बनानी होगी। तो एक और सवाल यह हो सकता है: दो (कुछ) फर्जी होने के आसार दिखाई दे रहे हैं और आप नहीं देख रहे हैं? ;)
जोओ पोर्टेला

64
9000 का टकराव? मैंने अपनी नौकरी छोड़ दी और मधुमक्खी कीपर बन गया।
सेबेस्टियन पैटन

95

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

कृपया याद रखें कि चेरी उठाया या रिबेस प्रतिबद्ध है अलग Git की दृष्टि से, मूल की तुलना में (विभिन्न SHA-1 पहचानकर्ता है) तो यह अलग है की तुलना में दूरदराज के भंडार में प्रतिबद्ध। (रिबेस आमतौर पर इससे निपट सकता है, क्योंकि यह पैच आईडी यानी बदलावों की जांच करता है, कमिट आईडी नहीं)।

इसके अलावा git में आप एक साथ कई शाखाएँ मिला सकते हैं: तथाकथित ऑक्टोपस मर्ज । ध्यान दें कि ऑक्टोपस मर्ज को संघर्षों के बिना सफल होना है। फिर भी यह उपयोगी हो सकता है।

HTH।


19
+1 इस बात के लिए कि वास्तव में रिजेक्ट / चेरी-पिकिंग कमिट्स को "कॉपी" करता है और इसलिए मूल कमिट के लिए लिंकेज खो देता है।
स्टूजेक

1
हम इस फैशन में चेरी-पिक का उपयोग करते हैं, विशेष रूप से बग-फिक्स (शायद बहुत कम सुविधाओं) के लिए एक मौजूदा रिलीज शाखा में पैच तैयार करने के लिए। कई सुविधाएँ जो आम तौर पर वारंट जारी करती हैं, जो मास्टर के आधार पर रिलीज़ शाखा में जाती है।
foxxtrot

3
@foxxtrot: एक अन्य समाधान एक बगफिक्स के लिए एक अलग शाखा बनाने के लिए है, जो कि इस बग को प्रदर्शित करने वाली सबसे पुरानी प्रतिबद्ध पर आधारित है, और इसे 'मेन्ट' और 'मास्टर' में विलय कर देता है ... हालांकि इस मामले में आपको यह जानना होगा कि बगफिक्स ने कहा है दोनों शाखाओं पर लागू होता है।
जैकब नर

4
@ याकूब दो कमांड्स जो बगफिक्स ब्रांच बनाने और मर्ज करने के लिए अपरिहार्य हैं: उस कमेट git blameको खोजने के लिए जिसने बग को पेश किया था, और git branch --containsयह निर्धारित करने के लिए कि ब्रांच का विलय कहां किया जाए। इस पोस्ट
gcbenison

-10

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


यह बिल्कुल स्पष्ट नहीं है कि यह सवाल का जवाब कैसे देता है, शायद कुछ उदाहरण कुछ प्रकाश लाएंगे।
एड्रियन नासुई

1
यह तथ्य कि आपका इतिहास सीधा दिखेगा, इसका मतलब यह नहीं है कि इसे समझना आसान होगा।
निकोलिमोरी

मर्ज करना एक स्वच्छ इतिहास का सामान्य तरीका है। चेरी-पिक और रिबेस को ज्यादातर उन स्थितियों के लिए उपयोग किया जाता है जहां आपको इतिहास को संशोधित करना होगा। क्या मतलब है कि विलय हमेशा पहली पसंद होना चाहिए। जब आप रीमोट और कई लोगों के साथ काम करते हैं तो रीमेज़ ने कॉमिट शॉ को बदल दिया है जो बहुत खतरनाक है।
Radon8472 16

यह लड़का यहीं एक पदक का हकदार है। वह जानता है कि वह नीचे उतरना जारी रखेगा लेकिन यह सही उत्तर है। कुडोस।
पीडब्लू कद

क्षमा करें, मैंने अब तक इन टिप्पणियों को नहीं देखा था, कृपया समापन से पहले अपने परीक्षण वातावरण में इसे आज़माएं और जो आपके लिए काम करता है! मेरे पास कई उत्पाद शाखाओं में योगदान देने वाले लगभग 600 डेवलपर्स हैं, मुझे परवाह नहीं है कि स्थानीय कार्यक्षेत्र में डेवलपर्स क्या करते हैं, जब एकीकरण के लिए एक परिवर्तन प्रस्तुत किया जाता है तो यह विकास शाखा या कभी-कभी रिलीज या बग फिक्स शाखा में सक्षम होना चाहिए। FYI करें ... मैं Gerrit का उपयोग करता हूं।
नागराज मगदुम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.