2012-02-19 11 views
5

में उपयोग करने के लिए मर्ज-बेस कैसे निर्दिष्ट करूं, मैं एक जटिल एचजी भंडार में एक जटिल विलय करने की कोशिश कर रहा हूं। मैं "नवीनतम साझा पूर्वजों" से खुश नहीं हूं कि मर्कुरियल मर्ज करने के लिए "आधार" के रूप में उपयोग करना चुनता है।मैं 'hg merge'

मैं आधार के रूप में उपयोग करने के लिए अपनी पसंद की एक विशिष्ट प्रतिबद्धता निर्दिष्ट करना चाहता हूं।

क्या यह संभव है, और यदि हां, तो कैसे?

उत्तर

14

Mercurial 3.0: अब आप विलय आधार के रूप में उपयोग करने के लिए पूर्वजों का चयन कर सकते हैं। आप merge.preferancestor सेट करके ऐसा करते हैं। जब यह समझ में आता है तो Mercurial आपको इसके बारे में बताएगा। नीचे दिए गए उदाहरण के साथ, आप देखेंगे: लेज़ी बेजर सही है कि आप पूर्वज जब यह कमांड लाइन से उपयोग करते हुए मर्क्युरियल द्वारा उठाया नहीं चुन सकते है:

$ hg merge 
note: using eb49ad46fd72 as ancestor of 333411d2f751 and 7d1f71140c74 
     alternatively, use --config merge.preferancestor=fdf4b78f5292 
merging x 
0 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

संस्करण 3.0 से पहले मर्क्युरियल। हालांकि, आप इसे आंतरिक रूप से कर सकते हैं और इसके लिए एक एक्सटेंशन लिखना बहुत मुश्किल नहीं है:

from mercurial import extensions, commands, scmutil 
from mercurial import merge as mergemod 

saved_ancestor = None 

def update(orig, repo, node, branchmerge, force, partial, ancestor=None): 
    if saved_ancestor: 
     ancestor = scmutil.revsingle(repo, saved_ancestor).node() 
    return orig(repo, node, branchmerge, force, partial, ancestor) 

def merge(orig, ui, repo, node=None, **opts): 
    global saved_ancestor 
    saved_ancestor = opts.get('ancestor') 
    return orig(ui, repo, node, **opts) 

def extsetup(ui): 
    extensions.wrapfunction(mergemod, 'update', update) 
    entry = extensions.wrapcommand(commands.table, 'merge', merge) 
    entry[1].append(('', 'ancestor', '', 'override ancestor', 'REV')) 

इसे एक फ़ाइल में रखें और एक्सटेंशन लोड करें। अब आप

hg merge --ancestor X 

सामान्य पूर्वजों को ओवरराइड करने के लिए उपयोग कर सकते हैं। जैसा कि आपने पाया है, यह कई संभावित पूर्वजों के मामले में एक फर्क पड़ता है। यदि आप क्रिस-क्रॉस विलय करते हैं तो वह स्थिति उत्पन्न होती है।

@ changeset: 4:333411d2f751 
|\ 
+---o changeset: 3:7d1f71140c74 
| |/ 
| o changeset: 2:fdf4b78f5292 
| | 
o | changeset: 1:eb49ad46fd72 
|/ 
o changeset: 0:e72ddea4d238 

आप सामान्य रूप से विलय यदि आप पूर्वज के रूप में changeset eb49ad46fd72 हो और फ़ाइल x शामिल हैं:: ग्राफ इस तरह दिखता है

hg init; echo a > x; hg commit -A -m a x 
hg update 0; echo b >> x; hg commit -m b 
hg update 0; echo c >> x; hg commit -m c 
hg update 1; hg merge --tool internal:local 2; echo c >> x; hg commit -m bc 
hg update 2; hg merge --tool internal:local 1; echo b >> x; hg commit -m cb 

: आप इन आदेशों के साथ इस तरह के मामले बना सकते हैं

a 
c 
b 
c 

यदि आप इसके बजाय hg merge --ancestor 2 का उपयोग करते हैं तो आपको एक अलग परिणाम मिलता है:

a 
b 
c 
b 

दोनों मामलों में, मेरे KDiff3 किसी भी विवाद की रिपोर्ट किए बिना स्वचालित रूप से मर्ज को संभालने में सक्षम थे। अगर मैं "रिकर्सिव" विलय रणनीति का उपयोग करता हूं और पूर्वजों के रूप में e72ddea4d238 चुनता हूं, तो मुझे एक समझदार संघर्ष प्रस्तुत किया जाता है। गिट डिफ़ॉल्ट रूप से रिकर्सिव मर्ज रणनीति का उपयोग करता है।

+0

यह एक वाह है! सही काम करता है। आपका बहुत बहुत धन्यवाद। वास्तव में, मुझे समझ में नहीं आता कि यह सुविधा Mercurial में क्यों शामिल नहीं है। ज्यादातर मामलों में किसी को इसकी आवश्यकता नहीं होगी, लेकिन मामलों में जब आवश्यक हो तो यह हल करने वाले संघर्षों के घंटों को बचा सकता है, या यहां तक ​​कि गलत ऑटो विलय को भी रोक सकता है। रेपो में गलत बदलाव के बाद मुझे अभी ऐसे मुद्दों का सामना करना पड़ा है। –

-1

आप इसे नहीं कर सकते हैं। क्योंकि नवीनतम साझा पूर्वज अपने मर्ज के लिए वास्तविक आधार है

आप मर्ज करना चाहते हैं और फिर से लगता है कि नहीं करना चाहते हैं (क्योंकि आपके तर्क आधार दिखाएँ/मुझे/गलत मान्यताओं और समाधान-पथ) आप जा सकते हैं क्लोन-रीबेस-मर्ज-निर्यात-आयात पैच मार्ग

+3

कई उम्मीदवार साझा किए गए पूर्वजों को "समान रूप से ठीक", लेकिन अलग-अलग हो सकते हैं। देख http://man.he.net/man1/git-merge-base –

+0

@LucasMeijer - 1. हमने कहा मर्क्युरियल के बारे में, Git नहीं 2. वे ** रहे ** "समान रूप से ठीक" नहीं, नवीनतम पूर्वज है क्योंकि * "बेहतर" * –

+2

यह जानने का आपका कारण क्या है कि नवीनतम _always_ सबसे अच्छा है। इमो, यह जानने का कोई तरीका नहीं है। (हालांकि आमतौर पर सबसे नया सबसे अच्छा है)। गिट लिंक केवल एक ऐसी स्थिति को दर्शाता है जहां कोई "सर्वश्रेष्ठ" नहीं है, एक ऐसी स्थिति जो कि मर्कुरियल में भी हो सकती है। –

1

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

+0

हाँ , मैं पूरी तरह से मैन्युअल मार्ग पर जा सकता हूं, और प्रत्येक मर्जऑनफ्लिक्ट के लिए मैन्युअल रूप से इच्छित आधार में पेस्ट कॉपी कर सकता हूं। मैं 20+ विलय विवादों को देख रहा हूं, और अनुमान लगाया कि हम कुछ स्वचालित रूप से पता लगाने में सक्षम होना चाहिए। –

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