2010-01-26 9 views
93

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

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

मुझे पता है hg update -C किसी स्थानीय परिवर्तन को ओवरराइट करता है। लेकिन मैं किसी भी स्थानीय काम को कैसे हटा सकता हूं?

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

उत्तर

123

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

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

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

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

% hg strip 'roots(outgoing())' 
+1

धन्यवाद! मैं एक परिस्थिति में समाप्त हुआ कि यह पूरी तरह हल हो गया, बिना किसी झगड़े के। – eswald

+1

यह मुझे उपरोक्त बड़े फिक्स से बचाया, बहुत सरल, धन्यवाद! –

+1

अगर किसी को 'एचजी स्ट्रिप' जड़ें (आउटगोइंग()) '' काम करने के कारण '' जड़ें (आउटगोइंग()) ''पहचानने की समस्या नहीं है। मैं इसे 'एचजी स्ट्रिप "जड़ों (आउटगोइंग()) के साथ काम करने में सक्षम था" '। – SombreErmine

8

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

+0

Thats मुझे Mercurial – PurplePilot

+0

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

+0

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

2

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

21

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

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

hg clone -r good foo foo-clean 

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

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


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

+0

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

+0

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

5

आप

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

किसी भी मारने के लिए उपयोग कर सकते हैं संशोधन और इसके स्थानीय भंडार में इसके उप-दल।

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

लेकिन कुछ भी है कि पहले से ही पुश किए गए के लिए उपयोग करने की कोशिश नहीं करते।

2
hg strip `hg out --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`

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

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

तुम भी आप TortoiseHg उपयोग कर रहे हैं यह डिफ़ॉल्ट भंडार के साथ की जाँच नहीं लेकिन एक और भंडार

hg strip `hg out OTHER_REPO_ALIAS --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`
0

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

संबंधित मुद्दे