2-वे मर्ज पर 3-तरफ़ा मर्ज लाभप्रद क्यों है?


165

विकिपीडिया का कहना है कि 3-वे मर्ज 2-वे मर्ज की तुलना में कम त्रुटि वाला है, और अक्सर समय के लिए उपयोगकर्ता के हस्तक्षेप की आवश्यकता नहीं होती है। यह एक केस क्यों है?

एक उदाहरण जहां 3-तरफ़ा मर्ज सफल होता है और 2-तरफ़ा मर्ज विफल होता है।

जवाबों:


259

आप और आपके मित्र दोनों ने एक फ़ाइल की जाँच की, और उसमें कुछ बदलाव किए। आपने शुरुआत में एक लाइन निकाली, और आपके दोस्त ने आखिर में एक लाइन जोड़ी। फिर उसने अपनी फाइल बनाई, और आपको उसकी प्रति अपनी कॉपी में मर्ज करने की जरूरत है।

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

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


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

7
@ हारीरी कहो मूल की तीन लाइनें (एबीसी) थीं। यह मेरे मित्र की प्रतिलिपि (ABCD) से शुरू होता है, और मेरी (BC) से तुलना करता है। मूल को देखे बिना, यह सोच सकता है कि मैंने ए और डी दोनों को हटा दिया, और अंतिम परिणाम बीसी होना चाहिए।
जेडब्ल्यू।

80

एक प्रस्तुति प्रस्तुति से यह स्लाइड दिलचस्प है:

स्लाइड छवि

तीन-तरफ़ा मर्ज टूल का आवश्यक तर्क सरल है:

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

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

आप पूछ सकते हैं कि 2-तरफ़ा मर्ज पर 3-तरफ़ा मर्ज क्या लाभ प्रदान करता है। वास्तव में, दो-तरफा मर्ज जैसी कोई चीज नहीं है, केवल उपकरण हैं जो दो फाइलों को अलग करते हैं और आपको एक फ़ाइल या दूसरे से चुन चुनकर "मर्ज" करने की अनुमति देते हैं।
केवल 3-तरफा मर्ज आपको यह जानने की क्षमता देता है कि क्या एक ठग मूल से एक बदलाव है या नहीं और संघर्ष को बदलता है या नहीं।


"संघर्ष में परिवर्तन होता है या नहीं।" - 2-तरह से मर्ज नहीं किया जाता है (विस्‍तार) एक संघर्ष को दिखाता है (हालांकि जानकारी संघर्ष के स्रोत के रूप में खो गई है) /
व्लाद

1
यह हालांकि Git में 4-वे मर्ज करने के लिए सामान्य है जहां आधार वास्तव में समान नहीं है। अभी भी 3-तरफ़ा मर्ज बेहतर और 2-तरफ़ा है।
वर्नट

@Wernight, क्या 5-रास्ता मर्ज है?
पचेरियर

@Pacerier नहीं है कि मुझे पता है, लेकिन यह वास्तव में एक गेर चेरी-पिक, या रिबेस के दौरान क्या हो रहा है।
Wernight

बहुत विस्तृत और उपयोगी स्पष्टीकरण
केनग

20

मैंने इसके बारे में एक बहुत विस्तृत पोस्ट लिखी । मूल रूप से आप डिलीट / ट्रैक दो तरह से नहीं जोड़ सकते हैं, बहुत, बहुत अनुत्पादक।


@ पाब्लो, अगर मैं X से पहले कोई फ़ंक्शन जोड़ता हूं और आप X के बाद एक और फ़ंक्शन जोड़ते हैं और हम तीन तरह से मर्ज करते हैं, तो टूल स्वचालित रूप से दोनों परिवर्तनों को लागू करेगा । लेकिन क्या होता है जब मेरा परिवर्तन वास्तव में आपके परिवर्तन के साथ संघर्ष करता है (जैसे हम में से प्रत्येक एक ही फ़ंक्शन नाम के साथ एक नया फ़ंक्शन बनाते हैं)? स्वचालित विलय से कैसे पता चलेगा कि हमारे कुछ "उबाऊ आसान" मर्ज वास्तव में संघर्ष का कारण बन सकते हैं ?
पचेरियर

1
बस अपने ट्यूटोरियल को पढ़ें, और यह वास्तव में मेरे लिए उपयोगी है। मुझे उसी तरह से महसूस हो रहा है जैसा कि आपके द्वारा वर्णित डेवलपर्स। मैंने हमेशा तीन-तरफा मर्ज की आशंका जताई है।
15:19 पर racl101

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

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

20

तीन तरह से विलय होता है जहां एक आधार फ़ाइल में दो बदलावों को विलय कर दिया जाता है क्योंकि वे लागू होते हैं, एक को लागू करने का विरोध करते हैं, फिर दूसरे के साथ परिणाम का विलय करते हैं।

उदाहरण के लिए, दो परिवर्तन होने पर जहां एक रेखा को एक ही स्थान पर जोड़ा जाता है, उसे दो जोड़ के रूप में देखा जा सकता है, एक रेखा का परिवर्तन नहीं।

उदाहरण के लिए

फ़ाइल को दो लोगों द्वारा संशोधित किया गया है, एक जोड़ जोड़, एक माउस जोड़ रहा है।

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

अब, यदि हम परिवर्तनों को मर्ज करते हैं, जैसा कि हम उन्हें लागू करते हैं, हम प्राप्त करेंगे (3-तरफ़ा मर्ज)

#diff b and c, a
    dog
+++ mouse
+++ moose
    cat

लेकिन अगर हम बी लागू करते हैं, तो बी से सी में बदलाव को देखें तो ऐसा लगेगा कि हम सिर्फ 'यू' को 'ओ' में बदल रहे हैं (2-वे मर्ज)

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