सभी स्थानीय परिवर्तन हटाएं और पेड़ पर वापस जाएं


95

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

दूसरे शब्दों में, मैं स्थानीय शाखा के टिप में मौजूद (ए) के समान ही स्थानीय कोड के साथ समाप्त करना चाहता हूं और (बी) किसी भी स्थानीय आवागमन का इतिहास नहीं है।

मुझे पता है कि hg update -Cकिसी भी स्थानीय परिवर्तन को अधिलेखित किया जाता है। लेकिन मैं किसी भी स्थानीय आवागमन को कैसे हटाऊं?

स्पष्ट होने के लिए, स्थानीय स्तर पर मैंने जो भी काम किया है, उसे संरक्षित करने में मेरी कोई दिलचस्पी नहीं है। मैं सिर्फ एक पूरी तरह से साफ स्थानीय चेकआउट पर वापस जाने का सबसे सरल तरीका चाहता हूं।


जवाबों:


129

जब सबसे सरल तरीका (एक नया hg clone) व्यावहारिक नहीं है, तो मैं उपयोग करता हूं hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

hg outgoingशांत रहने तक दोहराएं । ध्यान दें कि hg strip $revतिरछा $revऔर उसके सभी वंशज।

ध्यान दें कि आपको पहले stripअपनी Mercurial सेटिंग्स में सक्षम करना पड़ सकता है ।

पुनश्च: एक भी होशियार दृष्टिकोण को पुनर्जीवित भाषा का उपयोग है, और करते हैं:

% hg strip 'roots(outgoing())'

1
धन्यवाद! मैं एक ऐसी स्थिति में समाप्त हो गया, जो पूरी तरह से हल हो गई, जिसमें कोई उपद्रव नहीं हुआ।
22

1
इसने मुझे ऊपर बड़े सुधारों से बचाया, बहुत सरल, धन्यवाद!
डेविड सी।

3
अगर किसी को hg strip 'roots(outgoing())'पहचानने में दिक्कत होने के कारण काम करने में समस्या होती है 'roots(outgoing())'। मैं इसके साथ काम करने में सक्षम था hg strip "roots(outgoing())"
jsea

@SombreErmine इन cmd.exe, हाँ।
बस किसी ने

21

आप एक स्थानीय क्लोन बनाना चाहते हैं जहाँ आप केवल उन परिवर्तनों को संरक्षित करते हैं जो दूरस्थ रिपॉजिटरी में भी मौजूद हैं। TortoiseHg का उपयोग करें , hg logया यह पता लगाने के लिए कि आपके संशोधनों में से कौन सा नवीनतम संशोधन है जिसे आपने नहीं बनाया (गड़बड़ शुरू होने से पहले)। उपयोग hg outgoingकरने से यहां मदद मिल सकती है - यह आपके द्वारा किए गए सभी परिवर्तनों को सूचीबद्ध करेगा - उनमें से किसी से भी पहले एक संशोधन संख्या चुनें।

यदि लक्ष्य संशोधन कहा जाता है goodऔर आपका क्लोन कहा जाता है foo, तो करें:

hg clone -r good foo foo-clean

यह एक तेज, स्थानीय ऑपरेशन होगा - फिर से सब कुछ डाउनलोड करने का कोई कारण नहीं हैfoo-cleanक्लोन केवल संशोधन करने के लिए changesets में शामिल होंगे good। अब आप बदल सकते हैं foo-clean/.hg/hgrcके साथ foo/.hg/hgrcजैसे कि डिफ़ॉल्ट धक्का / खींच मार्ग के रूप में के लिए अपने भंडार-स्थानीय सेटिंग संरक्षित करने के लिए।

आप संतुष्ट हैं जब कि foo-cleanसब कुछ आप से की जरूरत है foo, तो बस हटाना fooऔर का नाम बदलने foo-cleanके लिए foo। एक है hg pullअपने क्लोन में दूरस्थ रिपोजिटरी से किसी भी नए changesets हो और सामान्य की तरह जारी रखने के लिए।


यदि किसी ने नए परिवर्तनों को दूरस्थ रिपॉजिटरी में नहीं धकेल दिया है, तो यह निर्धारित करना बहुत सरल है कि आप किस संशोधन का उपयोग goodऊपर करना चाहते हैं : hg id defaultआपको दूरस्थ रिपॉजिटरी में टिप की आईडी बताएगा।


मैं एक ही स्थिति में हूं, लेकिन रेपो डायरेक्टरी में बहुत सारी फाइल है लेकिन hignignore में हैं। एचजी स्ट्रिप स्थापित नहीं कर सकते हैं और पूरे क्लोन को बदलने के बिना स्थानीय कमिट्स को छोड़ना चाहेंगे। कोई विचार? - आह! यदि मैंने कोई फ़ाइल नहीं जोड़ी है, तो मुझे अपनी पुरानी निर्देशिका में दूसरे क्लोन की प्रतिलिपि बनाने में सक्षम होना चाहिए !?
पेटीएम

यदि आपके पास कई शाखाएँ हैं, तो इस विधि से सावधान रहें। एक निर्दिष्ट संशोधन तक क्लोनिंग केवल निर्दिष्ट संशोधन की शाखा पर परिवर्तनकर्ता को मिलती है। फिर आपको hg pull -rप्रत्येक अतिरिक्त शाखा के अंतिम "अच्छे" संशोधन के लिए हो सकता है ।
यिट्ज

9

ठीक। तो बस सभी स्थानीय सामान, hg initनया स्थानीय भंडार और hg pullआपके पास नवीनतम टिप हटा दें । इसके hg updateबाद मत भूलना ।


धन्यवाद। जब आप कहते हैं कि 'सभी स्थानीय सामान हटाएं', तो क्या आपका मतलब है कि संपूर्ण रिपॉजिटरी या केवल मेरे परिवर्तन को हटा दें? Hg init क्या करता है (Googled है, लेकिन एक सरल विवरण नहीं देख सकता है) और क्या मुझे इसके साथ किसी भी झंडे का उपयोग करने की आवश्यकता है? क्या यह मेरी मर्क्यूरियल .hgrc वरीयताओं जैसी चीजों को हटा देगा?
रिचर्ड

अपडेट: यदि मैं प्रोजेक्ट रूट डायरेक्टरी में सब कुछ डिलीट करता हूं, तो 'hg init' टाइप करें, मुझे 'abort: repository' मिलता है। पहले से ही मौजूद है!'। क्या मुझे नई निर्देशिका से सेट अप करने और काम करने की आवश्यकता है? मैं नहीं तो संभव नहीं होता ... निश्चित रूप से स्थानीय रूप से मैंने जो कुछ भी किया है उसे मारने का एक सरल तरीका होना चाहिए ?!
रिचर्ड

हां, सभी रिपॉजिटरी सामान सहित सब कुछ हटा दें। एक नए साफ फ़ोल्डर से शुरू करें। आपकी प्राथमिकताएँ आप बैकअप फ़ाइल में सहेज सकते हैं, और फिर hg init reponame के साथ आपके द्वारा बनाए गए नए भंडार में उन्हें पुनर्स्थापित कर सकते हैं। इनिट
anlemjerus

6
anlemjerus: hg init+ hg pull= hg cloneअंतर यह है कि आपके लिए hg cloneएक अच्छी .hg/hgrcफ़ाइल बनाता है और hg cloneएक ही फाइल सिस्टम पर क्लोनिंग करते समय अंतरिक्ष को बचाने के लिए हार्डलिंक का उपयोग करेगा।
मार्टिन गिस्सलर

रिचर्ड: इसका आउटपुट hg help initयहाँ है: selenic.com/mercurial/hg.1.html#init लेकिन शायद यह बहुत ही ट्रिक है? यदि आपको अधिक सहायता की आवश्यकता हो तो कृपया हमारी मेलिंग सूची को एक मेल भेजें! देखें: mercurial.selenic.com/wiki/MailingLists
मार्टिन गीस्लर

5

तुम उपयोग कर सकते हो

एचजी स्ट्रिप संशोधन

अपने स्थानीय भंडार में किसी भी संशोधन और उसके उपशीर्षक को मारने के लिए।

https://www.mercurial-scm.org/wiki/Strip

लेकिन किसी भी चीज़ के लिए इसका उपयोग करने की कोशिश न करें जो पहले से ही धकेल दिया गया है।


आप इसे सार्वजनिक संशोधन पर उपयोग कर सकते हैं, लेकिन यदि आप फिर से खींचते हैं, तो यह फिर से दिखाई देगा। (hg स्ट्रिप केवल स्थानीय रिपॉजिटरी के साथ काम करता है।)
माइक रोज़ॉफ्ट

2

बस अपने स्थानीय सिस्टम पर सब कुछ हटा दें और रिमोट रेपो को फिर से क्लोन करें।


2
hg की पट्टी `hg out --template" {Rev} {लेखक} \ n "| grep your_AUTHOR_NAME | cut -d "" -f 1`

मेरे लिए चाल है।

यह उन सभी संशोधनों को स्ट्रिप्स करता है जिन्हें डिफ़ॉल्ट रिपॉजिटरी में नहीं धकेला जाता है जो आपके लेखक नाम के साथ बनाई जाती हैं।

आप इस शैली का उपयोग डिफ़ॉल्ट रिपॉजिटरी के साथ नहीं बल्कि किसी अन्य रिपॉजिटरी के साथ करने के लिए भी कर सकते हैं

hg स्ट्रिप `hg out OTHER_REPO_ALIAS --template" {Rev} {लेखक} \ n "| grep your_AUTHOR_NAME | cut -d "" -f 1`

0

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

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