2009-07-03 18 views
44

में शाखाओं के बीच एक फ़ाइल विलय करना जब मेरे पास एचजी रेपो में दो शाखाएं हैं, तो किसी अन्य शाखा के साथ केवल एक फ़ाइल को विलय कैसे करें, बिना किसी अन्य फाइल को विलय से विलय कर दिया जाए?Mercurial: एक repo

क्या पूरे बदलाव की बजाय केवल कुछ फ़ाइलों को मर्ज करना संभव है?

उत्तर

50

चेतावनी: @Martin_Geisler द्वारा अनुशंसित एक "डमी विलय", वास्तव में आपको गड़बड़ कर सकता है, अगर बाद में आप दो शाखाओं का सही विलय करना चाहते हैं। डमी विलय रिकॉर्ड किया जाएगा, और कहें कि आप जिस शाखा में डमी विलय करते हैं उसमें आप विलय करते हैं - आपको परिवर्तन दिखाई नहीं देंगे। या यदि आप दूसरी शाखा में विलय करते हैं, तो उस दूसरी शाखा में किए गए परिवर्तन पूर्ववत किए जाएंगे।

सब आप चाहते हैं एक शाखा से दूसरे में एक पूरी फाइल कॉपी करने के लिए है, तो आप बस कर सकते हैं:

hg update -r to-branch 
    hg revert -r from-branch file 
    hg ci -m 'copied single file from from-branch to to-branch 

आप उस फ़ाइल के विभिन्न भागों का चयन करना चाहते हैं, तो "hg record" उपयोगी है।

मैंने अभी यह अपनी होम निर्देशिका पर किया है। Hgignore।

यदि दोनों शाखाओं ने उस फ़ाइल में बदलाव किए हैं जिन्हें आप रखना चाहते हैं, तो एक गंदे चाल संभवतः एक और शाखा पर संभवतः संभवतः/संभवतः किसी अन्य शाखा पर दो शाखाओं का विलय बनाना होगा, उसमें जांचें, और फिर मर्ज और करने वाली शाखा के बीच एक एकल फाइल कॉपी:

hg update -r to-branch 
    branch merge-branch 
    hg merge -r from-branch 
    hg ci -m 'temp merge to be discarded" 
    hg update -r to-branch 
    hg revert -r merge-branch single-file 
    hg ci -m 'merged single-file from from-branch to to-branch" 
    hg strip merge-branch 

यह उल्लेख के लायक है: जिस तरह से "शाखाओं के बीच एक एकल फाइल कॉपी करने के लिए" (या संशोधन, या संशोधन से मर्ज करने के लिए, या ... ।) "एचजी रिवर्ट" है। अर्थात।

hg update -r Where-you-want-to-copy-to 
    hg revert -r Where-you-want-to-copy-from file-you-want-to-copy 
    ... 
    hg ci 

किसी कारण मैं के लिए, और मेरे सहकर्मियों में से कुछ, इस बहुत भ्रमित पाते हैं। "वापस" == "प्रतिलिपि" ... कुछ उपयोग पैटर्न के लिए समझ में आता है, लेकिन सभी नहीं।

+2

यह स्वीकार्य उत्तर होना चाहिए एक मार्टिन गीस्लर ने दिया। हालांकि यह वास्तव में फ़ाइल को मर्ज नहीं करेगा, इसकी प्रतिलिपि बनाना वह है जो अधिकतर समय करना चाहता है और यह शाखा को गड़बड़ नहीं करेगा। – noamik

+2

यह एक शाखा से एक फ़ाइल लाने के लिए बहुत अच्छा काम करता है ट्रंक। हालांकि, मुझे लगता है कि एक बात यह है कि ट्रंक में चेकइन फ़ाइल के इतिहास में दिखाई नहीं दे रहा है, जो दुर्भाग्यपूर्ण है। –

+0

हैलो और आपके उत्तर के लिए धन्यवाद। हालांकि, मुझे अपनी स्थिति में परेशानी हो रही है स्रोत शाखा में एक फ़ाइल होती है जो मेरी डिफ़ॉल्ट शाखा में मौजूद नहीं होती है, लेकिन मैं इसे बाकी शाखा को विलय किए बिना वापस कॉपी करना चाहता हूं। जब मैं आपके द्वारा वर्णित किए गए कार्यों को करने का प्रयास करता हूं तो मुझे '12 में ऐसी कोई फ़ाइल नहीं मिलती ' कोई सुझाव? – propagated

18

नहीं। एक परिवर्तन आधार पर Mercurial काम करता है।

लेकिन आप "dummy merge" कर सकते हैं जहां आप शाखाओं में से किसी एक से आने वाले परिवर्तनों को अनदेखा करते हैं। प्रतिबद्ध करने से पहले आप चयनित फ़ाइलों को जो भी राज्य चाहते हैं उसे वापस कर सकते हैं:

% HGMERGE=internal:local hg merge  # keep my files 
% hg revert --rev other-branch a.txt # update a.txt to other branch 
% hg commit -m 'Dummy merge to pick a.txt from other-branch.' 

शायद इससे आपको थोड़ा सा मदद मिलेगी।

+2

चेतावनी: इस तरह के एक "डमी मर्ज" वास्तव में आप छेड़छाड़ न कर सके अप , यदि बाद में आप दो शाखाओं का एक वास्तविक विलय करना चाहते हैं। डमी विलय रिकॉर्ड किया जाएगा, और कहें कि आप जिस शाखा में डमी विलय करते हैं उसमें आप विलय करते हैं - आपको परिवर्तन दिखाई नहीं देंगे। या यदि आप दूसरी शाखा में विलय करते हैं, तो उस दूसरी शाखा में किए गए परिवर्तन पूर्ववत किए जाएंगे। // यदि आप चाहते हैं कि एक पूरी फ़ाइल को एक शाखा से दूसरी शाखा में कॉपी करना है, तो आप बस "एचजी अपडेट-आर टू-शाखा; एचजी रिवर्ट -आर फाइल" // // अगर आप उस फाइल के विभिन्न हिस्सों को चुनना चाहते हैं , फिर "एचजी रिकॉर्ड" उपयोगी है। // मैंने बस यह मेरी होम निर्देशिका पर किया। Hgignore। –

+0

एक गंदे चाल एचजी विलय का उपयोग करके दो शाखाओं का विलय बनाना होगा, उसमें जांच करें, और उसके बाद "एचजी अपडेट-टू-शाखा; शाखा विलय-शाखा का उपयोग करके विलय और शाखा के बीच एक फ़ाइल को कॉपी करें ; एचजी मर्ज-आर शाखा से; एचजी सीआई-एम 'अस्थायी विलय को त्याग दिया जाएगा "; एचजी अपडेट-टू-शाखा; एचजी रिवर्ट -आर मर्ज-शाखा सिंगल-फाइल-यू-वांट; एचजी सीआई-एम 'शाखा से लेकर शाखा तक विलय एकल फ़ाइल "; एचजी स्ट्रिप मर्ज-शाखा। –

+1

ओह, हेक, मैं भी अपनी टिप्पणियों को वास्तविक उत्तर में बना सकता हूं। –

1

मैं उन दो फ़ाइलों को अलग करने के लिए vimdiff जैसे बाहरी उपकरण का उपयोग करूंगा जो मैं विलय करना चाहता हूं और फिर उन्हें मर्ज करें। इसका लाभ यह है कि आप फ़ाइल के कुछ हिस्सों पर चुनिंदा संपादन कर सकते हैं। उदाहरण के लिए:

hg update -r branch-merging-to 
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging 

यह आप अपने .hgrc, जो सिर्फ इन लाइनों को जोड़ने का मतलब है में बाहरी उपकरण सक्षम करने की आवश्यकता करने के लिए:

[extensions] 
hgext.extdiff =