मर्क्यूरियल में ग्राफ्ट के उपयोग के परिणाम


98

हाल ही में मर्क्यूरियल में रिलीज शाखाओं को बनाए रखने पर बदलाव लंघन के बारे में कई सवाल किए गए हैं। उदाहरण के लिए:

चूंकि यह 2.0 में पेश किया गया था, इसलिए मैंने graftइस समस्या से बचने के लिए उपयोग करने के बारे में सोचा है। इस तरह एक संशोधन पेड़ दिया:

A---B---C---D---E---F---G---H---I---J

मान लें कि हमें एक रिलीज शाखा बनाने की ज़रूरत है जो बुराई परिवर्तन को रोक देती है E

hg update -r D
hg graft "F::J"

हमें देना:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • Q1: यहाँ क्या हुआ? मैं समझ सकता हूं कि transplantइससे पैच बाहर हो गए होंगे F::J, और फिर उन्हें लागू किया जाएगा D, लेकिन graftकहा जाता है कि पैच के बजाय 3-वे मर्ज का उपयोग करें। तो वह कैसे काम करता है? यह बेहतर क्यों है?

मुझे लगता है कि मैं अब ठीक कर देता हूं E, और इसे मेरी रिलीज शाखा में विलय कर देता हूं।

                  --E2-----------------
                 /                     \
A---B---C---D---E---F---G---H---I---J---M1
             \                            \
              --F'--G'--H'--I'--J'---------M2--

एम 1 एक सीधा मर्ज है; वहां कुछ खास नहीं। एम 2 उन शाखाओं का विलय कर रहा है जिनमें "समान" (या कम से कम समतुल्य) परिवर्तन हैं।

  • Q2: यह मर्ज केवल एक सामान्य 3-तरफ़ा मर्ज का उपयोग कर रहा है D, J'और M1?
  • क्यू 3: मर्ज के साथ मदद करने के लिए ग्राफ्ट ऑपरेशन के बारे में अतिरिक्त जानकारी संग्रहीत या उपयोग की गई है?

और अंत में...

  • Q4: इस तरह एक प्रवाह के साथ संभावित समस्याएं क्या हैं?

जवाबों:


119

जब आप अपडेट Dऔर ग्राफ्ट करते हैं F::J, तो Mercurial कई मर्ज चलाता है। यह इस मर्ज के साथ शुरू होगा:

M = three_way_merge(local=D, other=F, base=E)

यदि हम +dराज्यों Cऔर के बीच डेल्टा के लिए लिखते हैं D, तो हम इसके साथ शुरू करते हैं:

        +d     +e     +f
---- C ---- D ---- E ---- F ----

ग्राफ़ को 90 डिग्री पर दक्षिणावर्त घुमाएँ और ऊपर का तीन तरफ़ा मर्ज इस तरह दिखता है:

    -e  
  .---- D
 /
E
 \
  '---- F
    +f

यही है, हम दिखावा करते हैं कि हमने शुरुआत की थी Eऔर -eपाने के लिए इसके विपरीत आवेदन किया था D। मुझे इसका उल्टा पैच लगता है +e। शुरू में Eहम भी Fसामान्य डेल्टा के साथ राज्य के लिए गए थे +f। यहाँ अजीब कुछ भी नहीं है - हम सभी राज्यों (है D, Eऔर Fपहले से ही भंडार में)। तो इस तरह देखा, यह स्पष्ट है कि हम विलय कर सकते हैं Dऔर F

विलय "हीरा पूरा करने" का विषय है। इसलिए हम एक नए राज्य को खोजने Mका एक मिश्रण है कि Dऔर Fऔर जहां से अंतर Dकरने के लिए Mकरने के लिए इसी तरह की है +fऔर से अंतर Fकरने के लिए Mकरने के लिए इसी तरह की है -e। यह इस तरह दिख रहा है:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'

+fडेल्टा बन गया +f'और -eडेल्टा बन गया -e'। यह केवल एक सामान्य तीन-तरफा मर्ज है, लेकिन प्रभाव दिलचस्प है: हमने इसके बजाय लागू Fकिया Dहै E!

मर्ज करने के बाद, के दूसरे माता पिता Mको Fगिरा दिया जाता है:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \
  '---- F
    +f

दोहराना करने के लिए: हम "प्रभाव" की नकल की है Fपर Dयह है कि,, हम एक डेल्टा (पाया है +f') पर लागू Dके रूप में जब एक ही प्रभाव देने +fके लिए लागू किया गया था E। हम ग्राफ को थोड़ा सीधा कर सकते हैं:

       +f'
--- D ---- M
     \
      '---- E ---- F
        +e     +f

नतीजा यह है कि पूर्ण तीन-तरफा मशीनरी का उपयोग करने Fपर ग्राफ्ट किया जाता है D

  • Q1: यहाँ क्या हुआ? तो वह कैसे काम करता है? यह बेहतर क्यों है?

    A1: मर्ज का उपयोग पैच से बेहतर है क्योंकि मर्ज मशीनरी खाते में नाम बदलने जैसी चीजों को लेती है।

  • Q2: क्या यह D, J 'और M1 का उपयोग करके केवल 3-तरफ़ा मर्ज करने का एक सामान्य तरीका है?

    A2: हाँ, ग्राफ्टिंग ग्राफ के टोपोलॉजी को नहीं बदलता है।

  • क्यू 3: मर्ज के साथ मदद करने के लिए ग्राफ्ट ऑपरेशन के बारे में अतिरिक्त जानकारी संग्रहीत या उपयोग की गई है?

    A3: नहीं

  • Q4: इस तरह एक प्रवाह के साथ संभावित समस्याएं क्या हैं?

    A4: मर्ज परिप्रेक्ष्य से यह ठीक काम करना चाहिए। यह कुछ इतिहास की नकल करेगा जो लोगों के लिए भ्रमित करने वाला हो सकता है।


4
बढ़िया सवाल, बढ़िया जवाब :)। +1 दोनों को!
लॉरेंस होल्स्ट

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

3
@PaSS: मुझे लगता है कि आप सभी को पता होना चाहिए कि ग्राफ्ट ट्रांसप्लांट की तुलना में अधिक मजबूत तरीके से चारों ओर बदलाव की नकल कर सकता है। इस अर्थ में मजबूत है कि नामकरण संभाला जाता है और आप एक मर्ज टूल में संघर्षों को हल कर सकते हैं। विवरण अजीब मर्ज में हैं जो इसे करता है, लेकिन यह उम्मीद है कि ग्राफ्ट के रोजमर्रा के उपयोग के लिए समझने के लिए आवश्यक नहीं है! :-)
मार्टिन गिस्लर

3
नहीं, लेकिन मैं सामान को समझने की कोशिश करने के लिए एक चूसने वाला हूं।;; मैं वैसे भी एक आधार के रूप में आपके एक का उपयोग करके अधिक सामान्य उदाहरण के माध्यम से काम करता हूं।
पॉल एस

@PaulS यदि ऐसा है, तो मैं आपका उल्लेख करने से लगभग डरता हूं ... लेकिन आप डार्क्स और इसके पैच सिद्धांत को देख सकते हैं । ग्राफ़ को 90 डिग्री घुमाने के बारे में ऊपर दी गई ट्रिक मुझे बहुत याद दिलाती है कि विलय के समय वे पैचिंग के बारे में कैसे बात करते हैं। सुंदर बालों वाला सामान :-)
मार्टिन गीस्लर

6

Q1: जब टकराव होता है तो यह मदद करता है। आप तब अपने सामान्य मर्ज टूल का उपयोग कर सकते हैं (मेरे लिए यह इनलाइन संघर्ष मार्कर है, जिसे मैं Emacs के स्मार्गर-मोड के साथ संपादित करता हूं)।

Q2: यह एक सामान्य मर्ज है।

Q3: नहीं।

Q4: मुझे लगता है कि यह दो लगभग समान शाखाओं के लिए बदसूरत है।

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