क्या मर्क्यूरियल में स्थानीय कमिट्स को हटाने का कोई तरीका है?


209

इसलिए मैं मर्क्यूरियल में एक मूर्खतापूर्ण गलती करता रहता हूं। अक्सर बार, मैं "hg पुल" और "hg अपडेट" किए बिना काम शुरू करूंगा। जब मैं अपने परिवर्तनों को आगे बढ़ाने की कोशिश करता हूं, मुझे एक त्रुटि मिलती है।

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

फिर, मैं केवल "hg ci" के साथ किए गए स्थानीय कमिट्स को हटाने की कोशिश कर रहा हूं। मैं फ़ाइलों को संशोधित नहीं करना चाहता, आदि।


संभावित डुप्लिकेट stackoverflow.com/questions/2139165/…
N 1.1

12
यह एक मूर्खतापूर्ण गलती नहीं है, यह सामान्य वर्कफ़्लो है जब कई लोग एक ही रिपॉजिटरी के साथ काम कर रहे हैं।
Juozas Kontvainis

जवाबों:


247

" पट्टी " एक्सटेंशन सक्षम करें और निम्न टाइप करें:

hg strip #changeset# --keep

कहाँ #changeset#changeset आप निकालना चाहते हैं के लिए हैश है। यह उक्त परिवर्तनों सहित उन परिवर्तनों को हटा देगा जो इससे उतरते हैं और आपकी कार्यशील निर्देशिका को अछूता छोड़ देंगे । यदि आप अपने प्रतिबद्ध कोड परिवर्तन को वापस करना चाहते हैं तो --keepविकल्प को हटा दें ।

अधिक जानकारी के लिए, स्ट्रिप एक्सटेंशन की जांच करें ।

यदि आपको "अनकाउन्टेड कमांड 'स्ट्रिप' मिलता है, तो आपको इसे सक्षम करने की आवश्यकता हो सकती है। ऐसा करने के लिए .hgrcया Mercurial.iniफ़ाइल ढूंढें और इसे निम्न जोड़ें:

[extensions]
strip =

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

stripजब आप वास्तव में शाखा को प्रदूषित करने वाले परिवर्तनों से छुटकारा पाना चाहते हैं, तो कमांड उपयोगी है। वास्तव में, यदि आप इस प्रश्न की स्थिति में हैं और आप स्थायी रूप से सभी "ड्राफ्ट" परिवर्तन सेटों को पूरी तरह से हटाना चाहते हैं , तो शीर्ष उत्तर की जाँच करें , जो मूल रूप से करने का सुझाव देता है:

hg strip 'roots(outgoing())'

8
@ भारत: आपको विस्तार को सक्षम करने की आवश्यकता है
समरसा

1
मर्क्यूरियल 2.8 के बाद से, स्ट्रिप एक स्टैंडअलोन एक्सटेंशन है, इसलिए बस strip = ठीक है। WhatsNew for Mercurial 2.8
चिह-हसन येन

104

यदि आप Hg कछुआ का उपयोग कर रहे हैं तो बस एक्सटेंशन " पट्टी " को सक्रिय करें :

  1. फ़ाइल / सेटिंग्स / एक्सटेंशन /
  2. पट्टी का चयन करें

फिर नीचे संशोधन का चयन करें, जहां से आप स्ट्रिपिंग शुरू करना चाहते हैं, right clickउस पर कार्य करके, और चयन करके:

  1. इतिहास को संशोधित करें
  2. पट्टी

सिर्फ इस तरह:

यहां छवि विवरण दर्ज करें

इस उदाहरण में यह 19 वें संशोधन से अंतिम एक (22) तक मिटा देगा।


2
File/Settings/Extensions/काश मैं और वोट जोड़ पाता। आपका बहुत बहुत धन्यवाद!
dyatchenko

अरे! मैंने यह कोशिश की, लेकिन "कोई बैकअप नहीं" या "स्थानीय परिवर्तनों को त्यागने" की जांच न करने के बावजूद मेरे सभी परिवर्तनों को डंप करने के लिए यह लग रहा था। मैं उन परिवर्तनों को रखना चाहता था, बस उन्हें प्रतिबद्ध नहीं करना चाहता था! क्या अब उन्हें ठीक करने का कोई रास्ता है ??
टिम टिस्डाल

2
मुझे इसे ठीक से करने का कोई तरीका नहीं मिल रहा है, लेकिन ऐसा लगता है कि आपको जिस सामग्री को पास करने की आवश्यकता है उसे रख सकते हैं --keepऔर TortoiseHg उस विकल्प को नहीं देता है। तो ... आपको इसे कमांड लाइन पर करने की आवश्यकता है hg strip -r . --keep
टिम टिसडाल

3
स्ट्रिप हेल्प से: '' स्ट्राइप्ड-बैकअप '' को किसी भी बंडल के रूप में ".hg / स्ट्रिप-बैकअप" में संग्रहित किया जाता है (देखें "hg help बंडल" और "hg help unbundle")। उन्हें "hg unbundle .hg / strip-backup / BUNDLE" चलाकर पुनर्स्थापित किया जा सकता है, जहाँ BUNDLE स्ट्रिप द्वारा बनाई गई बंडल फ़ाइल है। '
टिम टिसडाल

SourceTree में भी यह उपयोगी था। धन्यवाद!
पेमोनारेंको ओलेह

22

आधुनिक उत्तर (केवल मर्क्यूरियल 2.1 के बाद प्रासंगिक):

चरणों का उपयोग करें और उस संशोधन को चिह्नित करें जिसे आप गुप्त (निजी) के रूप में साझा नहीं करना चाहते हैं। इस तरह जब आप धक्का देते हैं तो वे भेजे नहीं जाएंगे।

TortoiseHG में आप इसके चरण को बदलने के लिए कमिट पर क्लिक कर सकते हैं।

इसके अलावा: आप अपने स्थानीय कमिट्स को खींचने के बाद अपने स्थानीय कमिट्स को साझा रिपॉजिटरी के प्रमुख तक ले जाने के लिए एक्सटेंशन "रिबास" का भी उपयोग कर सकते हैं।


निजी == अब रहस्य
दिमित्री ओसिनोवस्की

15

जैसा कि हर कोई इंगित कर रहा है कि आपको शायद केवल खींचना चाहिए और फिर सिर को मर्ज करना चाहिए, लेकिन अगर आप वास्तव में अपने एडिटिंगहिस्टॉर टूल्स के बिना अपने कमिट्स से छुटकारा पाना चाहते हैं, तो आप hg clone -rसभी पाने के लिए अपने रेपो को बदल सकते हैं, लेकिन वे बदल जाते हैं।

यह उन्हें मूल भंडार से नहीं हटाता है, लेकिन यह एक नया क्लोन बनाता है जो उनके पास नहीं है। फिर आप अपने द्वारा संशोधित रेपो को हटा सकते हैं (यदि आप चाहें)।


क्या "hg क्लोन -r" स्थानीय परिवर्तन हटाता है? मैं सिर्फ चीजों को सरल रखने के लिए स्थानीय कमिट्स को हटाना चाहता हूं।
user191535

4
यह उन्हें क्लोन रिपोजिटरी से नहीं हटाता है, लेकिन यह एक नया क्लोन बनाता है जो उनके पास नहीं है। यदि आप चाहें तो आप संशोधित रेपो को हटा सकते हैं।
Ry4an Brase

9

मुझे यह समस्या भी आई। मैंने 2 बनाये commitऔर दोनों कमिट्स को रोलबैक और डिलीट करना चाहता था।

$ hg rollback

लेकिन hg rollbackसिर्फ आखिरी कमिट में वापस जाता है, 2 नहीं। उस समय मुझे इसका एहसास नहीं हुआ और मैंने कोड बदल दिया।

जब मैंने पाया hg rollbackकि सिर्फ एक कमिट वापस किया था, तो मैंने पाया कि मैं इस्तेमाल कर सकता हूं hg strip #changeset#। इसलिए, मैं hg log -l 10नवीनतम 10 कमिट ढूंढता था और जो मैं चाहता था वह सही बदलाव प्राप्त करता थाstrip

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

क्या abort: local changes foundमतलब है? इसका अर्थ है कि hgउस कोड में परिवर्तन पाया गया जो अभी तक प्रतिबद्ध नहीं है। तो, इसे हल करने के लिए, आपको hg diffउस कोड को सहेजना चाहिए जिसे आपने बदल दिया है hg revertऔर hg strip #changeset#। सिर्फ इस तरह:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

आपके द्वारा उपरोक्त कार्य किए जाने के बाद, आप patchअंतर फ़ाइल कर सकते हैं और आपका कोड आपके प्रोजेक्ट में वापस जोड़ा जा सकता है।

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

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


1
एक गलत इतिहास और संभावित भ्रष्टाचार होने की कीमत पर अगर आप चीजों को गलत करते हैं।
Ry4an Brase


4

hg stripवह है जो आप ढूंढ रहे हैं। git resetयदि आप गिट से परिचित हैं तो यह अनुरूप है ।

कंसोल का उपयोग करें:

  1. आपको रिवीजन नंबर जानना होगा। hg log -l 10। यह कमांड अंतिम 10 कमिट्स दिखाता है। वह कमिटमेंट खोजें जिसकी आपको तलाश है। आपको चेंज लाइन से 4 अंकों की संख्या चाहिएchangeset: 5888:ba6205914681

  2. तब hg strip -r 5888 --keep। यह कमिट के रिकॉर्ड को हटा देता है, लेकिन सभी फाइलों को संशोधित करता है और फिर आप उन्हें फिर से जमा कर सकते हैं। (यदि आप केवल हटाने के लिए फ़ाइलें हटाना चाहते हैं - प्रशासनhg strip -r 5888


1

[Hg Tortoise 4.6.1] यदि यह हालिया कार्रवाई है, तो आप "रोलबैक / पूर्ववत करें" कार्रवाई (Ctrl + U) का उपयोग कर सकते हैं।

एचजी कछुआ छवि


एक छवि को शामिल करने की दोहरी जाँच करें।
बिल केलर

0

समौरा के शानदार जवाब के अलावा, आप evolveएक्सटेंशन के pruneएक सुरक्षित और पुनर्प्राप्त संस्करण के रूप में उपयोग कर सकते हैं जो stripआपको कुछ भी गलत करने की स्थिति में वापस जाने की अनुमति देगा।

मेरे पास ये उपनाम हैं .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

ध्यान दें कि आपके pruneपास काम करने वाली डायरेक्टरी को बरकरार रखने के लिए, --keepजैसे stripआप फाइलों को फिर से जमा करना चाहते हैं।

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