मर्क्यूरियल - पुराने संस्करण पर वापस लौटें और वहाँ से जारी रखें


249

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

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

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

मुझे कौन सी कमांड / सेट की आवश्यकता है?


6
रुचि रखने वाले किसी भी व्यक्ति के लिए यह संबंधित साइडबार पर पॉप अप किया गया है जो कि रिवर्ट बनाम अपडेट का एक बड़ा विवरण है: stackoverflow.com/questions/2506803/…
पाओलो

जवाबों:


150
hg update [-r REV]

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


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

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

उत्तर ठीक है, मर्ज के बारे में थोड़ा छोड़कर (मुझे नहीं लगता कि प्रश्नकर्ता विलय करना चाहेगा)।
सीटीएल-अल्ट-डेलोर

3
@NeonWarge REV केवल संशोधन के लिए एक प्लेसहोल्डर है। यह उसका नंबर, उसका हैश, बुकमार्क आदि हो सकता है। ट्रेवर: यह संदिग्ध नहीं है क्योंकि यह कुछ भी विलय नहीं करता है। कोई आवश्यता नहीं।
डैनमैन

401

यहाँ आज्ञाओं पर धोखा पत्र है:

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

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

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

यदि आप उपयोग करते हैं hg update --rev 38, तो 39-45 के बदलावों को एक मृत अंत के रूप में छोड़ दिया जाएगा - एक झूलने वाला सिर जिसे हम कहते हैं। जब आप धक्का देते हैं तो आपको एक चेतावनी मिल जाएगी जब आप "पुश करने वाले भंडार" में "कई सिर" बनाएंगे। चेतावनी यह है कि यह इस तरह के प्रमुखों को छोड़ने के लिए एक तरह से अयोग्य है क्योंकि वे सुझाव देते हैं कि किसी को मर्ज करने की आवश्यकता है। लेकिन आपके मामले में आप बस आगे बढ़ सकते हैं और 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 बनाएगा जो संशोधन के समान दिखता है। आप फिर से संशोधन 46 से काम करना जारी रखेंगे। यह अभ्यस्त इतिहास में एक स्पष्ट तरीके से एक कांटा नहीं बनाता है जैसा hg updateकि किया था, लेकिन दूसरी ओर आप अभ्यस्त होने के बारे में शिकायत करते हैं कई सिर। मैं का प्रयोग करेंगे hg revertअगर मैं दूसरों जो पहले से ही संशोधन 45 अन्यथा के आधार पर अपने स्वयं के काम बना दिया है के साथ सहयोग कर रहे थे, hg updateअधिक स्पष्ट है।


2
भयानक जवाब। मैंने hg revert --all --rev ## का इस्तेमाल किया और इसने मेरी गांड को बचाया: D
Van Thoai Nguyen

1
क्या झूलने वाले सिर की शाखा को बंद करना भी बेहतर नहीं होगा ? यह भंडार पर भविष्य की चेतावनी को रोक देगा। देखें stackoverflow.com/a/3688320/900130
Zoltán

नोट: hg revert --all --rev xxx स्थानीय फ़ाइलों को संशोधित करने के लिए आवश्यक है जहाँ से आप अपने स्थानीय रेपो में हैं। इसलिए आपको इससे पहले अपडेट करना होगा कि आप कहां से वापस आना चाहते हैं।
विंसेंट

पहले वाले संस्करण को बंद करने के लिए, मुझे पहले एक रिवर्ट करना था, और फिर एक अपडेट। यह कहा जा रहा है, सबसे की तुलना में कम अपारदर्शी स्पष्टीकरण।
कोडालुकर

30

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

hg revert path/to/file -r-2

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


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

आप एक विशिष्ट संशोधन का चयन भी कर सकते हैं। जैसेhg revert path/to/file -r478
मैट '

7

IMHO, hg strip -r 39इस मामले को बेहतर तरीके से सूट करता है।

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


इस एक के बारे में पता नहीं था। रेपो को हटाने और पुन: क्लोनिंग की तुलना में आसान और क्लीनर। धन्यवाद।
मोनिका की बहाली - 18

6

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

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

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

इसके बाद उल्लेख के अनुसार दो सिर बनाए गए।

धक्का देने से पहले दूसरे सिर से छुटकारा पाने के लिए, मैंने उस स्थिति को मापने के लिए नो-ओप मर्ज़ कदम का पालन ​​किया ।

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


आप commit --close-branchपुरानी शाखा पर कर सकते हैं । आप push -fनए सिर को धक्का भी दे सकते हैं, लेकिन इससे भ्रम पैदा हो सकता है क्योंकि यह वर्तमान है।
सीटीएल-अल्ट-डेलोर

5

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

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

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

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

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


1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.