2012-03-07 12 views
97

में भ्रष्टाचार का उपयोग करने के नतीजे हाल ही में मर्कुरियल में रिलीज शाखाओं को बनाए रखने के दौरान कई बदलाव हुए हैं। उदाहरण के लिए:Mercurial

चूंकि यह 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: क्या सिर्फ यहाँ क्या हुआ? मैं समझ सकता हूं कि transplantF::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: इस तरह एक प्रवाह के साथ संभावित समस्याओं क्या हैं?

उत्तर

118

जब आप D और ग्राफ्ट F::J पर अपडेट करते हैं, तो Mercurial कई विलय चलाता है।ऊपर तीन

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

ग्राफ 90 डिग्री दक्षिणावर्त मुड़ें और: यह इस मर्ज के साथ शुरू होगा:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • प्रश्न 2: क्या यह डी, जे 'और एम 1 का उपयोग करके सामान्य सामान्य 3-तरफा विलय है?

    ए 2: हां, ग्राफिंग ग्राफ की टोपोलॉजी को परिवर्तित नहीं करता है।

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

    ए 3: सं

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

    ए 4: मर्ज दृष्टिकोण से यह ठीक काम करना चाहिए। यह कुछ इतिहास को डुप्लिकेट करेगा जो लोगों के लिए भ्रमित हो सकता है।

+4

महान प्रश्न, महान उत्तर :)। दोनों को +1! –

+0

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

+3

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

6

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

प्रश्न 2: यह एक सामान्य विलय है।

Q3: नहीं

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