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




version-control mercurial (6)

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

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

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

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


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

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

hg clone -r good foo foo-clean

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

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

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


जब सबसे आसान तरीका (एक नया 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 और उसके सभी वंशजों को समाप्त कर देता है।

पीएस: पुनरावृत्ति भाषा का उपयोग करना भी एक बेहतर तरीका है, और करें:

% hg strip 'roots(outgoing())'

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


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


आप इस्तेमाल कर सकते हैं

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

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

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

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


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

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

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

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

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




head