इतिहास से हटाए बिना परिवर्तनों का परित्याग


180

एक प्रतिबद्धता है कि बस काम नहीं किया, इसलिए मैं इसे इतिहास से हटाए बिना इसे छोड़ देना चाहता हूं ।

मैंने पहले के संशोधन से अपडेट किया है और इस प्रकार एक नया सिर बनाया है।


मेरे पास शाखाएं नहीं हैं, मुझे शाखाएं नहीं चाहिए, मैं बस नए सिर के साथ ठीक उसी तरह चलना चाहता हूं जैसे यह है, कुछ भी नहीं फैंसी, कोई मर्ज नहीं है, कोई चिंता नहीं है, बस पिछले एक को भूल जाओ।

मुझे लगता है कि ऐसा करने का तरीका नहीं मिल रहा है, और मुझे विश्वास है कि यह नहीं किया जा सकता है। मुझे लगता है सभी शाखाओं के बारे में सामान है, या विलय के बारे में सामान है।


1
यह आपके रेपो में है, इसलिए इसे इतिहास से हटाया नहीं गया है। आपने एक नया सिर बनाया है, इसलिए आप गलती के बिना संशोधन कर सकते हैं। आपको नए सिर के साथ जाने से क्या रोक रहा है?
ataylor

शाखाओं के प्रति आपके विरोध के साथ क्या है?
एंड्रेस जान टैक

@Andres यह शाखाओं के बिल्कुल विपरीत नहीं है। मुझे बस इसे बंद करने के लिए एक बेवकूफ बनाने के अतिरिक्त कदम के बिना काम करने की आवश्यकता थी।
ओ ० '।

कोई भी पढ़ रहा है - कृपया ध्यान दें कि इस परिदृश्य में पहले से ही एक शाखा बनाई गई है; इस उत्तर में दी गई व्याख्या पर ध्यान दें: stackoverflow.com/a/3692607/3195477
UUDdLrLrSs

जवाबों:


181

उस संशोधन के साथ अपनी रिपॉजिटरी को अपडेट करें जिसे आप भूलना चाहते हैं, फिर hg commit --close-branchउस (अनाम) शाखा को बंद के रूप में चिह्नित करें। तब शाखा है कि आप के सिर करने के लिए अद्यतन करना चाहते हैं, और काम जारी रखने के।

यदि आप -cविकल्प का उपयोग करते हैं तब भी आप बंद शाखा को देख सकते हैं hg heads, लेकिन यह डिफ़ॉल्ट रूप से दिखाई नहीं hg mergeदेगा और बंद सिर के साथ विलय करने की कोशिश नहीं करेगा।

आपको hg push --forceपहली बार इस बंद सिर को दूसरे भंडार में धकेलने की आवश्यकता होगी क्योंकि जब आप धक्का देते हैं तो आप वास्तव में दूरदराज के भंडार में अतिरिक्त सिर बनाते हैं। तो मर्क्यूरियल को बताएं कि यह ठीक है --force। जो लोग बंद सिर को खींचते हैं वे किसी भी चेतावनी से परेशान होते हैं।


3
@Niall C. केवल तभी काम नहीं करेगा जब उसने एक नामित शाखा के रूप में चिह्नित किया हो? मैं यह मान रहा हूं कि वह जो कह रहा है, उसने किया है कि यह डिफ़ॉल्ट रूप से है
msarchet

लेकिन ... यह सच नहीं है, मुझे अभी भी दोनों सिर सूचीबद्ध हैं जब मैं फोन करता hg headsहूं ... मैं 1.4.3 का उपयोग कर रहा हूं, क्या यह एक नई विशेषता है?
ओ ० '।

2
@msarchet: AFAIK, आज की कोशिश कर रहा है, --close- शाखा अनाम शाखाओं के लिए काम नहीं करता है। यह करना चाहिए, लेकिन नहीं। मुझे उम्मीद है कि मर्क्यूरियल के कुछ भविष्य के संस्करण में यह बदलाव होगा। अनाम शाखाएं बहुत अच्छी हैं, लेकिन नामित शाखाओं के रूप में प्रथम श्रेणी होनी चाहिए।
क्रेजी गेलव

4
@KrazyGlew: समस्या यह है कि एक "अनाम" शाखा वास्तव में सिर्फ एक दूसरी शाखा है जिसका नाम उसी शाखा के साथ है जिस पर वह आधारित थी। आप वास्तव में (नामांकित) शाखा को बंद करने की कोशिश नहीं कर रहे हैं: आप अपने द्वारा किए जा रहे परिवर्तनों को त्यागने का प्रयास कर रहे हैं। दूसरे शब्दों में, आपको hg branchesअभी भी शाखा का नाम दिखाना चाहिए। शाखा को बंद करने की कोशिश करने के बजाय, अपनी अनाम शाखा को मूल शाखा में वापस मर्ज करें, सभी परिवर्तनों को छोड़ दें।
स्ट्रिपिंगवर्यर

2
मेरे मामले में, मेरी एक शाखा है जिसे डिफ़ॉल्ट कहा जाता है (यह मानक है) और दूसरे को डिफ़ॉल्ट / मास्टर कहा जाता है (मुझे लगता है कि इस तथ्य के कारण कि रिमोट डिपो वास्तव में गिट है)। hg अद्यतन डिफ़ॉल्ट / मास्टर; hg कमिट --close- शाखा; hg अद्यतन डिफ़ॉल्ट ने मेरे लिए काम किया।
मैट

68

मुझे पता है कि आप इस स्तर पर शाखाओं के साथ काम नहीं करना चाहते हैं , लेकिन आपने जो किया है वह ठीक यही है। जब आप पहले के संस्करण में वापस जाते हैं और कुछ ऐसा करते हैं जो काम करता है तो आपने एक शाखा बनाई - एक अनाम शाखा, लेकिन सभी एक शाखा।


बस आपको ले जाने में कोई समस्या नहीं है और आप कई सिर होने के बारे में चिंता नहीं कर रहे हैं, लेकिन अगर आप चीजों को ठीक करना चाहते हैं तो आप गलती से एक बार गलत सिर नहीं उठाते हैं तो आप पुरानी शाखा को मार सकते हैं।

Mercurial प्रलेखन में एक अच्छा खंड है जो आपको Pruning Dead Branches के आसपास कई विकल्पों के माध्यम से ले जाता है ।

मुझे लगता है कि आपके लिए सबसे अच्छा विकल्प पुरानी शाखा को "बंद" के रूप में चिह्नित करना है। यदि आपका पुराना सिर फिर से "123" है:

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default

3
Blurgh - मैंने दर्ज करने के बाद सिर्फ @ Niall का उत्तर देखा। नील और मेरा उत्थान शून्य अंक पूल में नष्ट हो सकता है। :)
निक पियरपॉइंट

1
मुझे आपका उत्तर बेहतर लगता है, इसके लिए मेरुचरिअल शब्दावली का कम इस्तेमाल करना पड़ता है (जो कि जैसा कि मैं बता सकता हूं कि यह git उपयोगकर्ताओं को भ्रमित करने के लिए चुना जा सकता है) है
tacaswell

8
इसके विपरीत है! मर्क्यूरियल की शब्दावली को प्राकृतिक रूप से svn उपयोगकर्ताओं के लिए चुना गया था, जबकि गिट एक नरक के रूप में भ्रमित है! वैसे भी, इस उत्तर को आगे बढ़ाते हुए क्योंकि इसमें अंतिम अद्यतन -C शामिल है
टोबिया

2
क्यों आप की क्या ज़रूरत है -Cमें hg update? ऐसा लगता है कि कोई भी फाइल संशोधित नहीं हुई होगी, इसलिए इसके बिना काम करना चाहिए।
अधिकतम

1
जहां तक ​​मैं बता सकता हूं, आपको कहीं भी -सी की जरूरत नहीं है। हालाँकि, यदि आप अपडेट करने का प्रयास करते हैं, तो आपके पास बकाया परिवर्तन हैं, आपको एक गर्भपात मिलेगा।
एली अल्बर्ट

21

सबसे पहले, टाइप करें:

hg heads

कल्पना कीजिए, आपके पास तीन प्रमुख सूचीबद्ध हैं:

changeset:   223:d1c3deae6297
user:        Your name  <your@email.com>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <your@email.com>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <your@email.com>
date:        Sat Sep 14 13:14:40 2013 +0200
summary:     commit description #1

मान लीजिए, आप अंतिम सिर को सक्रिय रखना चाहते हैं (223) और बाकी को बंद कर दें।

फिर आप निम्न कार्य करेंगे:

बंद सिर # 59

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

बंद सिर # 123

hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"

परिवर्तन करें

hg push

अंत में दाहिने सिर पर स्विच करना न भूलें

hg up -r 223

और आपने कल लिया।


यह एक अच्छा ट्यूटोरियल है, लेकिन उदाहरण के लिए प्रतिबद्ध संदेश थोड़े मेटा हैं। मैं बेहतर उदाहरणों को शामिल करूंगा ताकि आपसे सीखने वाले लोग बेहतर प्रतिबद्ध संदेश प्रदान कर सकें। कुछ इस तरह --close-branch -m "Closing branch - technique #2 abandoned in favor of technique #3"
जेसन आर। कोम्बस

5
इसके अलावा, आप अंत में काम कर रहे हैं, सिवाय इसके कि आपकी वर्किंग कॉपी अभी भी सिर पर है जिसे आपने अभी बंद किया है। एक और बदलाव बंद सिर पर होता है, इसे फिर से खोलना। आप hg up -r 223कोई भी बदलाव करने से पहले चाहते हैं।
जेसन आर। कोमब्स

@ जैसन आर। कोम्ब्स: सही है!
Artur Barseghyan

@Niall के अनुसार, और मेरा खुद का अनुभव अभी, आपको आवश्यकता होगी hg push --force, न कि केवल hg pushकई शीर्षों को आगे बढ़ाने के बारे में चेतावनी देने की।
क्रेक

1
@Artur मैं सामान्य रूप से सहमत हूँ। इस मामले में, hg pushअपने आप से मेरे लिए काम नहीं किया। यदि आप कई प्रमुखों के कारण मना कर देते हैं तो आप बाहरी रेपो में परिवर्तन करने की सलाह कैसे देते हैं?
क्रेक

12

आप उपयोग करना चाहते हैं hg backout। यह किसी भी बच्चे के बदलाव से परिवर्तन द्वारा किए गए परिवर्तनों को हटा देता है।

अच्छी व्याख्या के लिए इसे देखें। मर्क्यूरियल बैकआउट


2
यह बिल्कुल सही जवाब है। बैकआउट ने एक बदलाव का उलटा जोड़ दिया, काम को पूर्ववत कर दिया और आपको यह याद दिलाने के लिए एक प्रतिबद्ध संदेश दिया कि आपको यह विचार क्यों पसंद नहीं आया।
Ry4an Brase

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

1
@ मर्टिन गिस्लर, वैसे तो मैं सामान्य रूप से इससे सहमत हूं, लेकिन ओपी ने कहा कि वह शाखाओं के बिना बदलाव को छोड़ना चाहते थे
msarchet

2
@ मर्टिन गीस्लेर यार मैं ब्रांचिंग के लिए हूं बस कभी-कभी एक खराब बदलाव को
नाकाम कर

1
यह कभी-कभी उपयोगी हो सकता है, लेकिन यह वास्तव में वह नहीं था जो मैं चाहता था। वैसे भी धन्यवाद :)
o0 '।

2

Niall's और Nick दोनों के उत्तर सीधे हैं। क्योंकि मैं खुद को बहुत सारे झूलने वाले सिर बनाता हुआ पाता हूं, इसलिए मैंने एक उपनाम लिखकर सिर को और अधिक आसानी से बंद कर दिया। इसे अपने साथ जोड़कर .hgrc:

[alias]
behead = !REV=$($HG id -i); $HG update $@ -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q

(यदि आपके पास पहले से ही एक [alias]खंड है, तो आप इसके बजाय इसे जोड़ सकते हैं)

अब आप एक एकल-कमांड में एक सिर बंद कर सकते हैं (और मैन्युअल रूप से एक अलग बदलाव के लिए अद्यतन किए बिना) इस तरह से:

$ hg behead 123

नोट: उपनाम इस तथ्य का लाभ उठाता है कि मर्क्यूरियल उपनाम शेल कमांड हो सकते हैं । इसका मतलब है कि यह शायद केवल यूनिक्स पर काम करेगा, विंडोज पर नहीं।


2

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

मान लीजिए कि परिवर्तन इतिहास इस तरह दिखता है:

1-2-3-4-5-6    
       \    
        7-8-*

और यह है 5और 6जो अब नहीं चाहते हैं।

तुम यह केर सकते हो:

hg up 8
hg merge -r 6 -t :local
hg commit ...

जो इसे बनाएगा:

1-2-3-4-5-6    
       \   \
        7-8-9-*

यह 8सुनिश्चित करने के लिए अद्यतन कि आप इतिहास में वांछित सिर पर काम कर रहे हैं, जिसे आप रखना चाहते हैं।

-t :localनिर्देश देता है मर्ज "उपकरण" कहा जाता है का उपयोग करने के एचजी स्थानीय जो यह बताता है दूसरी शाखा, यानी से बदल जाता है, एक वर्तमान कार्यशील फ़ोल्डर राज्य का प्रतिनिधित्व करती नहीं की अनदेखी करने के। अधिक जानकारी

इस प्रकार इतिहास में अवांछित परिवर्तन होते हैं 5और 6संरक्षित होते हैं लेकिन हाल ही में कुछ भी प्रभावित नहीं करते हैं।


2

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

इवोल्व एक्सटेंशन के साथ, आप बस करते हैं

hg prune -r revname

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

यदि आप जो परेशान कर रहे हैं, वह आपके पूर्वजों को रखने के लिए है, तो आपको hg evolveउन बदलावों को वापस करने के लिए दौड़ना होगा । hg evolveस्वचालित रूप से ऐसा करेगा। अन्यथा, आपको कुछ करने की जरूरत नहीं है।


1

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

hg clone --rev myGoodResition myDirtyRepo myCleanRepo

1
यह पूरी तरह से नहीं है जो मैंने पूछा, क्षमा करें।
ओ ० '।

4
@ क्रिस्तोफ: यह एक मजाक है? मेरी पोस्ट की पहली पंक्ति को फिर से पढ़ें : " इसे इतिहास से हटाए बिना छोड़ दें "
o0 '।

-1

मैं इस मुद्दे में कई बार भाग चुका हूं जब मैं एक सिर को सिर पर रखना चाहता हूं जो गलती से बनाया गया था। मैं हमेशा इसे पृथ्वी के चेहरे से गायब देखना चाहता हूं।

अपनी स्थानीय प्रति पर, नवीनतम प्राप्त करें और फिर:

  1. उस सिर की शुरुआत का पता लगाएं जिसे आप पट्टी करना चाहते हैं (जहां एक नई गर्दन को शाखा करना शुरू होता है), संशोधन संख्या प्राप्त करें

  2. पट्टी कर दो।


स्रोत: TipsAndTricks

स्रोत: PruningDeadBranches # Using_strip

hg --config extensions.hgext.mq= strip -n <rev>
  1. एक तुच्छ फ़ाइल अपडेट करें (एक फ़ाइल में एक व्हाट्सएप जोड़ें), कमिट करें और पुश करें।

आपका रेपो अब सिर छीन लेना चाहिए। अंतिम चरण महत्वपूर्ण है क्योंकि स्ट्रिपिंग आपके केंद्रीय रिपॉजिटरी को धक्का दे सकता है कोई भी बदलाव नहीं करता है। अंतिम चरण के बिना आपने केवल स्थानीय रूप से सिर को छीन लिया है।


1
लेकिन, रिमोट रिपॉजिटरी से किसी भी चीज को कभी भी डिलीट नहीं किया जाता है। यह केवल जानकारी जोड़ता है। यदि परिवर्तन पहले से ही केंद्रीय भंडार पर है, तो आपको या तो विकसित विस्तार का उपयोग करने की आवश्यकता है, या किसी तरह इसे केंद्रीय सर्वर पर ही पट्टी करना होगा। यदि परिवर्तन पहले से ही केंद्रीय भंडार पर नहीं है, तो इसे स्थानीय रूप से अलग करना किसी भी आवश्यक धक्का के बिना पर्याप्त होगा।
बेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.