2010-06-30 7 views
12

एक परिदृश्य है जहां हमने अनजाने में नामित शाखा (ABC) को हमारी default शाखा में विलय कर दिया है।Mercurial Undo Merge

hg rollback एक विकल्प नहीं है क्योंकि वहां से कुछ जोड़े हुए हैं।

क्या इसे पूर्ववत करने का कोई तरीका है?

उत्तर

4

आप रेपो प्रकाशित नहीं किया है सार्वजनिक रूप से आप इस

hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new 

करते हैं और पुराने रेपो हटा सकते हैं।

+0

यह काम करता है ... धन्यवाद! अब मुझे एक शेष समस्या है: मेरे नए क्लोन भंडार में खराब विलय के बाद लागू परिवर्तन कैसे प्राप्त करें? –

+0

@Steve मेरा उत्तर देखें। आपको पुराने सिर पर उन्हें "रिबेस" करना होगा। – tghw

+0

बैकआउट विलय पूर्ववत नहीं कर सकता है। – tghw

8

आपको एमक एक्सटेंशन की आवश्यकता होगी। यदि आपने इसे चालू नहीं किया है, तो इसे अपने Mercurial.ini या .hgrc फ़ाइल में जोड़कर ऐसा करें।

[extensions] 
hgext.mq= 

आप इसे से परिचित नहीं हैं, तो Mq extension लेट के इतिहास आप में हेरफेर। अच्छी खबर यह है कि यह हमें आपके रेपो को ठीक करने की अनुमति देगा। बुरी खबर यह है कि जिनके पास गड़बड़ी वाले रेपो के क्लोन हैं, उन्हें फिर से क्लोन करना होगा, क्योंकि हम इतिहास बदल देंगे।

सबसे पहले, काम करने के लिए अपने रेपो का एक और क्लोन बनाएं, इसलिए हम कुछ भी गड़बड़ नहीं करते हैं।

अब, विलय परिवर्तन की संशोधन आईडी (जो default और आपकी नामित शाखा विलय हो) खोजें। नीचे लिखें। हम इसे changesetM के रूप में देखेंगे। अब अगले परिवर्तन की संशोधन आईडी पाएं। नीचे लिखें। हम इसे changesetN के रूप में देखेंगे।

एक बार आपके पास दो संशोधन संशोधन हैं, तो अपने कमांड प्रॉम्प्ट पर जाएं और cd अपने रेपो में जाएं। फिर बाहर निम्नलिखित, उचित संशोधन आईडी के साथ changeset[M|N] जगह

$ hg qimport -r changesetN:tip 
    # This will add all of your changes since the merge to the queue 
$ hg qpop -a 
    # This pops them all out of your history. 
$ hg strip changesetM 
    # This removes the merge changeset. 
$ hg update -C default 
    # Make sure we're on the default branch 
$ hg qpush -a 
    # Take the changesets in the queue and push them back onto your history. 
$ hg qfinish -a 
    # Remove changesets from the queue and finalize them as normal changesets. 

अनिवार्य रूप से, आप डिफ़ॉल्ट शाखा के शीर्ष पर नए changesets रिबेसिंग कर रहे हैं, इस प्रक्रिया में मर्ज changeset को हटाने टाइप .:। एक बार पूरा हो जाने के बाद, आपको सर्वर पर नए भंडार में बदलावों को धक्का देना होगा, और आपके सहयोगियों को ताजा प्रतियां क्लोन करनी होंगी।

आखिरकार, यदि आपके पास कोई अन्य Mercurial प्रश्न हैं, तो kiln.stackexchange.com देखें।

अद्यतन

मैं उल्लेख करना भूल गया: किसी ने कुछ है कि केवल अन्य शाखा में था पर परिवर्तन आधारित गया है, तो यह संभव है कि hg qpush -a असफल हो जायेगी। आप foo.txt.rej और foo.txt.orig फ़ाइल को चारों ओर बिछाने वाले देखेंगे। दुर्भाग्यवश, आपको इसे स्वयं ठीक करना होगा। इसे ठीक करने के लिए, मूल फ़ाइल, .orig फ़ाइल, और .rej फ़ाइल खोलें और मूल फ़ाइल में सहेजने के लिए सही परिवर्तनों को चुनें। एक बार जब आप इसे विलय कर लेंगे, उस पैच को नए, मर्ज किए गए पैच को अपडेट करने के लिए hg qrefresh का उपयोग करें। उनके से, आप hg qpush -a फिर से चलाने और जारी रखने में सक्षम होना चाहिए। यदि आप एक ही पैच पर फिर से एक ही त्रुटि में भागते हैं, तो बस उसी प्रक्रिया का पालन करें।

+0

मैं आपके साथ एचजी qpush -a तक हूँ। मैं कंसोल में निम्नलिखित हो: xxx.diff लागू करने फ़ाइल पैचिंग ----- हंक # 1 806 1 1 जिसे से बाहर पर FAILED विफल - बचत को खारिज कर दिया "..." पैच करने में विफल रहा, असमर्थ जारी रखें ... लागू होने के दौरान त्रुटियां, कृपया 310.diff –

+0

को ठीक करें और रीफ्रेश करें मेरे उत्तर में अद्यतन अनुभाग देखें। – tghw

+0

यह इतिहास को नष्ट कर देता है, इसलिए गलती का प्रचार होने पर यह काम नहीं करेगा। देखें: http://stackoverflow.com/questions/265944/backing-out-a-backwards-merge-on-mercurial –

3

मैं आज इस परिदृश्य में आए:

@ changeset: 1728:5d703e1051d3 
|\ parent:  1727:1a5f73b5edb4 
| | parent:  1720:65ddd0bde225 
| | user:  nn 
| | date:  Wed Feb 27 10:35:00 2013 +0100 
| | summary:  Merge with SomeBranch 
| | 
| o changeset: 1727:1a5f73b5edb4 
| | user:  nn 
| | date:  Wed Feb 27 10:34:30 2013 +0100 
| | summary:  lorem ipsum 
| | 
[some more changesets] 
| | 
o | changeset: 1720:65ddd0bde225 
| | branch:  SomeBranch 
| | user:  nn 
| | date:  Wed Feb 27 07:44:46 2013 +0100 
| | summary:  lorem ipsum 

कहाँ SomeBranchडिफ़ॉल्ट में विलय कर दिया गया जाना चाहिए था।

hg backout --rev=1728 --parent=1727 

इस करके आप पूर्ववत नहीं है मर्ज ही: एक शाखा ग्राफ को देखते हुए (या तो ग्राफ लॉग के साथ हम क्या इस को हल करने के लिए किया था, parent विकल्प तो तरह साथ backout आदेश का उपयोग करने के लिए था या TortoiseHg में) आप अभी भी कुछ ब्रंच देखेंगे डिफ़ॉल्ट r1728 पर। मर्ज के परिणाम हालांकि पूर्ववत किया गया है, जिसका अर्थ है कि बैकआउट (मेरे मामले में r1729) वाले परिवर्तनसेट r1727 के समान है।

+0

क्या यह विलय झंडे का भी ख्याल रखता है? – elzapp