2010-03-29 5 views
231

मैं एक परियोजना के लिए स्थानीय रूप से Mercurial का उपयोग कर रहा हूं (यह एकमात्र रेपो है जहां कहीं भी कोई धक्का नहीं है/खींच रहा है)।Mercurial - पुराने संस्करण पर वापस लौटें और वहां से जारी रखें

आज तक इसे एक रैखिक इतिहास मिला है। हालांकि, जिस चीज पर मैं काम कर रहा हूं, अब मुझे एक भयानक दृष्टिकोण है और मैं इसे शुरू करने से पहले संस्करण में वापस जाना चाहता हूं और इसे एक अलग तरीके से कार्यान्वित करना चाहता हूं।

मैं थोड़ा मर्क्युरियल में branch/revert/update -C आदेशों के साथ संदेह में हूँ। असल में मैं संस्करण 38 (वर्तमान में 45 पर) पर वापस जाना चाहता हूं और मेरे अगले कामों में 38 माता-पिता के रूप में हैं और वहां से आगे बढ़ते हैं। मुझे कोई परवाह नहीं है कि संशोधन 39-45 कभी भी खो गए हैं या अपने आप की एक मृत अंत शाखा में खत्म हो गए हैं।

मुझे किस आदेश/आदेश की आवश्यकता है?

+6

किसी भी दिलचस्पी के लिए, यह संबंधित साइडबार पर पॉप अप हो गया है जो रिवर्ट बनाम अपडेट का एक बड़ा स्पष्टीकरण है: http://stackoverflow.com/questions/2506803/difference-between-revert-and-update-in-mercurial – Paolo

उत्तर

141
hg update [-r REV] 

यदि बाद में आप प्रतिबद्ध करते हैं, तो आप प्रभावी रूप से एक नई शाखा बनायेंगे। फिर आप केवल इस शाखा पर काम करना जारी रख सकते हैं या अंत में मौजूदा में विलय कर सकते हैं।

+0

धन्यवाद, और अगली प्रतिबद्धता आरईवी हाँ से चलती है? – Paolo

+6

अगली प्रतिबद्धता एक नई शाखा तैयार करेगी। यदि आप अनिश्चित हैं, तो बस अपने संग्रह का बैकअप लें (काम करने वाली प्रति के साथ), इसे आज़माएं - परिणाम पसंद न करें -> बिना किसी कीमत पर स्क्रैच से शुरू करें – van

+0

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

376

यहाँ आदेशों पर नकल पुस्तिकाओं है:

  • hg update अपने काम की नकल माता पिता संशोधन बदल जाता है और यह भी फ़ाइल सामग्री इस नए माता पिता संशोधन मैच के लिए बदल जाता है। इसका मतलब है कि आपके द्वारा अपडेट किए गए संशोधन से नई प्रतिबद्धताएं जारी रहेंगी।

  • hg revert केवल फ़ाइल सामग्री को बदलता है और अकेले काम करने वाली प्रतिलिपि अभिभावक को छोड़ देता है। आप आमतौर पर hg revert का उपयोग करते हैं जब आप निर्णय लेते हैं कि आप अपनी कार्यशील प्रति में फ़ाइल में किए गए असामान्य परिवर्तनों को नहीं रखना चाहते हैं।

  • hg branch एक नई नामित शाखा शुरू करता है। एक नामित शाखा के बारे में सोचें जिसे आप परिवर्तनों को असाइन करते हैं। तो यदि आप hg branch red करते हैं, तो निम्न परिवर्तनों को "लाल" शाखा से संबंधित के रूप में चिह्नित किया जाएगा। यह परिवर्तनों को व्यवस्थित करने का एक अच्छा तरीका हो सकता है, खासकर जब विभिन्न लोग अलग-अलग शाखाओं पर काम करते हैं और बाद में आप देखना चाहते हैं कि एक परिवर्तन किस प्रकार से हुआ था। लेकिन आप इसे अपनी स्थिति में उपयोग नहीं करना चाहते हैं।

आप hg update --rev 38 उपयोग करते हैं, तो 39-45 एक मरे हुए अंत के रूप में छोड़ दिया changesets किया जाएगा - एक dangling प्रमुख के रूप में हम इसे कहते। जब आप धक्का देते हैं तो आपको चेतावनी मिलेगी क्योंकि आप जिस रिपोजिटरी को दबाते हैं उसमें आप "एकाधिक हेड" बनायेंगे। चेतावनी तब से है जब इस तरह के सिर छोड़ने के लिए यह अपमानजनक है क्योंकि वे सुझाव देते हैं कि किसी को विलय करने की आवश्यकता है। लेकिन आपके मामले में आप आगे बढ़ सकते हैं और hg push --force क्योंकि आप वास्तव में इसे लटकाना छोड़ना चाहते हैं।

यदि आपने अभी तक कहीं भी 39-45 संशोधन को धक्का नहीं दिया है, तो आप उन्हें निजी रख सकते हैं। यह बहुत आसान है: hg clone --rev 38 foo foo-38 के साथ आपको एक नया स्थानीय क्लोन मिलेगा जिसमें केवल 38 संशोधन होगा। आप foo-38 में काम करना जारी रख सकते हैं और आपके द्वारा बनाए गए नए (अच्छे) परिवर्तनों को दबा सकते हैं। आपके पास अभी भी foo क्लोन में पुराने (खराब) संशोधन होंगे। (आप क्लोन का नाम बदलने के लिए स्वतंत्र हैं, उदाहरण के लिए, foo से foo-bad और foo-38 से foo पर।)

अंत में, आप hg revert --all --rev 38 का भी उपयोग कर सकते हैं और फिर प्रतिबद्ध कर सकते हैं। यह एक संशोधन 46 बनाएगा जो संशोधित 38 के समान दिखता है। आप फिर संशोधन 46 से काम करना जारी रखेंगे। यह इतिहास में एक कांटा नहीं बनायेगा जैसा कि hg update किया गया था, लेकिन दूसरी तरफ आप शिकायत नहीं करेंगे कई सिर होने मैं hg revert का उपयोग करूंगा यदि मैं उन लोगों के साथ सहयोग कर रहा हूं जिन्होंने संशोधन 45 के आधार पर अपना स्वयं का काम कर लिया है। अन्यथा, hg update अधिक स्पष्ट है।

+1

अद्भुत उत्तर बचाया। मैंने एचजी रिवर्ट --all --rev ## का उपयोग किया और यह मेरे गधे को बचाया: डी –

+6

और एचजी क्लोन --rev 38 foo foo-38 बस मेरा बचाया। धन्यवाद!!! एचजी रिवर्ट के लिए –

+6

+1 --all --rev एक्स वाह। सुंदर। –

27

मुझे प्रतिबद्धता और धक्का देने के ठीक बाद, केवल एक फ़ाइल को पिछले संशोधन में वापस करने की आवश्यकता का सामना करना पड़ा। इन संशोधन निर्दिष्ट करने के लिए आशुलिपि वाक्यविन्यास अन्य उत्तर में शामिल नहीं है, इसलिए यहाँ करने के लिए आदेश है कि

hg revert path/to/file -r-2 

-2 कि संस्करण के लिए पहले पिछले वापस लौटने, प्रतिबद्ध होगा -1 का उपयोग कर सिर्फ वर्तमान अप्रतिबद्ध परिवर्तनों को वापस करेगा।

+0

मुझे यह बेहद उपयोगी लगता है। निश्चित रूप से -r विकल्प के लिए आप केवल संशोधन संख्या – Alex

6

hg update -r REV का उपयोग करने के बाद यह उस बदलाव को करने के तरीके के बारे में उत्तर में स्पष्ट नहीं था जिससे आप धक्का दे सकें।

यदि आप अपडेट के बाद प्रतिबद्ध करने का प्रयास करते हैं, तो Mercurial को नहीं लगता कि कोई बदलाव हैं।

मुझे पहले किसी भी फ़ाइल में बदलाव करना था (एक रीडमे में कहें) ताकि मर्कुरियल ने पहचाना कि मैंने एक नया बदलाव किया है, तो मैं इसे कर सकता हूं।

इसके बाद इसने दो प्रमुखों का उल्लेख किया।

धक्का देने से पहले दूसरे सिर से छुटकारा पाने के लिए, मैंने उस स्थिति को हल करने के लिए No-Op Merges चरण का पालन किया।

मैं तब धक्का देने में सक्षम था।

+0

प्रदान कर सकते हैं, आप पुरानी शाखा पर 'प्रतिबद्ध - क्लोज़-शाखा' कर सकते हैं। आप नए सिर को धक्का देने के लिए 'push -f' भी कर सकते हैं, लेकिन इससे भ्रम पैदा हो सकता है जिसके लिए यह वर्तमान है। –

7

आईएमएचओ, hg strip -r 39 इस मामले को बेहतर तरीके से सूट करता है।

इसे एमक एक्सटेंशन सक्षम करने की आवश्यकता है और मार्टिन गीस्लर द्वारा अनुशंसित "क्लोनिंग रेपो विधि" के समान सीमाएं हैं: यदि परिवर्तन किसी भी तरह प्रकाशित हुआ था, तो यह संभवतः (संभवतः) आपके रेपो में कुछ बिंदु पर वापस आ जाएगा समय क्योंकि आपने केवल अपना स्थानीय रेपो बदल दिया है।

+0

इस बारे में नहीं पता था। रिपो को हटाने और फिर से क्लोन करने से आसान और क्लीनर। धन्यवाद। – iamnotmaynard

3

उपरोक्त उत्तरों सबसे उपयोगी थे और मैंने बहुत कुछ सीखा। हालांकि, मेरी जरूरतों के लिए संक्षिप्त जवाब है:

hg revert --all --rev ${1} 

hg commit -m "Restoring branch ${1} as default" 

जहां ${1} संशोधन की संख्या या शाखा का नाम है। ये दो पंक्तियां वास्तव में एक बैश स्क्रिप्ट का हिस्सा हैं, लेकिन यदि आप इसे मैन्युअल रूप से करना चाहते हैं तो वे स्वयं ठीक काम करते हैं।

यह उपयोगी है अगर आपको रिलीज शाखा में एक गर्म फिक्स जोड़ने की आवश्यकता है, लेकिन डिफ़ॉल्ट रूप से निर्माण करने की आवश्यकता है (जब तक कि हम अपने सीआई उपकरण सही नहीं होते हैं और शाखाओं से निर्माण करने में सक्षम होते हैं और बाद में रिलीज शाखाओं के साथ भी दूर होते हैं) ।

1

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