क्या मैं मर्क्यूरियल में स्क्वैश कर सकता हूं?


109

मेरे पास कमिट्स की एक जोड़ी है जो वास्तव में सिर्फ एक होनी चाहिए। अगर मैं git का उपयोग कर रहा था, तो मैं उपयोग करूंगा:

git rebase -i <some-commit-before>

और फिर उन्हें स्क्वाश करें।

क्या मैं ऐसा कर सकता हूं? यदि हां, तो कैसे?

जवाबों:


88

हाँ, आप से किसी भी एक्सटेंशन के बिना इस तेज का उपयोग कर सकते श्रृंखलाबद्ध changesets

यदि आप एक एक्सटेंशन का उपयोग करना चाहते हैं, तो वैकल्पिक रूप से:


हाँ, मुझे लगता है कि सामान्य प्रश्न पर मेरी टिप्पणी में मुझे पसंद किए गए प्रश्नों में से उत्तर मिला। मुझे लगता है कि यह उस पर आपका जवाब है।
Ry4an Brase

4
थोड़ा साइड नोट: हेवेडिट एक्सटेंशन को मर्क्यूरियल 2.3 और बाद में वितरित किया गया है। आपको बस इसे सक्षम करना है।
पाधी १६'१५

1
कॉनटेनटेटिंग चेंजसेट्स में डॉक्टर "रेपोस" की अमूर्त अवधारणाओं का उपयोग करते हैं, मैं उन लोगों को कैसे संदर्भित करूं? उदाहरण के लिए: hg -R oldrepo निर्यात ... "abort: रिपॉजिटरी oldrepo नहीं मिला!" का उत्पादन करता है!
Aleksandr Levchuk

13
बस 2 स्क्वैश करने की कोशिश कर रहा है। क्या मुझे वास्तव में 10+ कमांड या वैकल्पिक एक्सटेंशन वाले विकी पेज की आवश्यकता है?
अलेक्सांद्र लेवचुक

3
टिप्पणियों को देखें। हेवडिट अब अंतर्निहित है, आपको इसे सक्षम करने की आवश्यकता है (क्योंकि कोई डिफ़ॉल्ट आदेश इतिहास को संशोधित नहीं करेगा)
Ry4an Brase

43

मेरा पसंदीदा hg strip --keepकमांड है। और फिर मैं एक कमिटमेंट में सभी बदलाव करता हूं।

यह मेरे लिए सबसे तेज़ और सबसे आरामदायक तरीका है, क्योंकि मैं अपने दैनिक काम के दौरान कई छोटे-छोटे काम करना पसंद करता हूं;)


नोट 1: सक्षम करने के लिए stripएक अंतर्निहित विस्तार की आवश्यकता है mq
नोट 2: मेरा पसंदीदा Git / Mercurial ग्राहक (SmartGit / Hg) डिफ़ॉल्ट --keepपैरामीटर द्वारा अपग्रेड करता है strip। और क्या और भी अधिक सुविधाजनक है: यह नामक विकल्प प्रदान करता है join commits:]


4
Hg स्ट्रिप के लिए पूर्ण कमांड है: पहली कमिट का रिवीजन नंबर hg strip --keep --rev [rev] जहां revआप पिछले एक के साथ स्क्वैश करना चाहते हैं
निकोलस फोर्नी

3
--revhg strip --keep [rev]
@ निकोलस फ़ॉर्नी

संशोधन मेरे लिए 3.3.3 में अनिवार्य है: hg help stripदेता है hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..., और छूट संशोधन मुझे देता है abort: empty revision set
रोमन स्टार्कोव

3
का उपयोग करना hg stripसबसे अच्छा विचार नहीं है। यह बिल्कुल सुरक्षित नहीं है। कोशिश करो hg histedit, शायद विकसित विस्तार का उपयोग करके भी प्रयास करें।
मार्टिन थॉमसन

Git लोगों के लिए सबसे स्वाभाविक तरीका लगता है;)
foo

32

रिबेस विस्तार एक आकर्षण की तरह काम किया। 2 स्क्वैश करने के लिए:

$ hg rebase --dest .~2 --base . --collapse

डॉट वर्तमान संशोधन के लिए एक शॉर्टकट है।

जब आप कुछ शाखा पर होते हैं तो यह और भी आसान हो जाता है और उन सभी को एक में समेटना चाहता है:

$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse

यह कैसे काम करता है:

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

( http://mercurial-scm.org/wiki/RebaseExtension#Collapsing से )


1
आपको दो कमिटियों के लिए "~ 2" कहां मिला?
Mi-La

1
इसे रीवसेट्स विषय में समझाया गया है, hg हेल्प रिसेट्स देखें।
मार्कंड

13

यदि आप इस उत्तर को पढ़ रहे हैं, तो आप इस उत्तर में उल्लिखित हर दूसरे विकल्प को भूल सकते हैं और विकसित एक्सटेंशनfold से कमांड का उपयोग कर सकते हैं ।

evolveभाड़े का विस्तार है जो हमें सुरक्षित उत्परिवर्तित इतिहास रखने में मदद करता है, हालांकि यह अभी भी प्रयोगात्मक है। आप इसे इसके रेपो से क्लोन करके और इसे अपने .hgrc में इस तरह से जोड़कर उपयोग कर सकते हैं ।

[extensions]
evolve = ~/evolve/hgext/evolve.py

यह मानते हुए कि आपने क्लोन किया है अपने होम डायरेक्टरी में रेपो को विकसित करते हैं। अब आप जाने के लिए अच्छे हैं। तुम भी मदद के लिए देख सकते हैं hg help fold

फोल्ड कमांड

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

अब मान लें कि आपके पास निम्नलिखित इतिहास है।

a -> b -> c -> d -> e -> f -> g

आप स्क्वैश करना चाहते हैं e, fऔर g। तुम कर सकते हो

hg up g
hg fold -r e

परिणाम होगा

a -> b -> c -> d -> h

जहां hchangeset जो सभी तीन प्रतिबद्ध से परिवर्तन होता है e, fऔर g

आप इतिहास के मध्य से बदलावों को भी मोड़ सकते हैं, यानी जरूरी नहीं कि आपको एक श्रृंखला चुननी पड़े जिसमें टिप शामिल हो। मान लीजिए आप मोड़ना चाहते हैं b, cऔर d। तुम कर सकते हो

hg up d
hg fold -r b
hg evolve --all

इसका परिणाम यह होगा

a -> i -> j

जहां iकी तह changeset है b, c, dऔर jके रूप में ही changeset है hउपयोगकर्ता गाइड विकसित करना एक पढ़ा जाना चाहिए।


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

... इसके अलावा, यदि आप वास्तव में कुछ जटिल कर रहे हैं, तो आप हमेशा बैकअप के रूप में उपयोग करने के लिए पहले स्थानीय रेपो को क्लोन कर सकते हैं। यह देखते हुए कि कितना दुर्लभ (उम्मीद है!), यह पूरी तरह से नए विस्तार का उपयोग करने के तरीके सीखने से कम प्रयास है।
आर्थर टाका

"NameError: नाम 'execfile' परिभाषित नहीं है" - जिसका अर्थ है विकसित करना पायथन 2 में लिखा गया है, जो मूल रूप से पत्थर की उम्र है।
नील जी

1
@ नीलगुरू व्यापारी अभी तक पायथन 3 का समर्थन नहीं करता है।
पुलकित गोयल

2
@ नील जीप, मर्क्यूरियल कम्युनिटी पी 3 सपोर्ट पाने के लिए कड़ी मेहनत कर रही है।
पुलकित गोयल

1

मर्क्यूरियल 4.8 (नवंबर 2018, 9 साल बाद) के साथ, आप नए कमांड पर विचार कर सकते हैं hg absorb(यह पहले एक प्रयोगात्मक विशेषता थी )।

देखें " मर्क्यूरियल 4.8 में कमिटमेंट कम करने के बदलाव "

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

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

स्वचालित पुनर्लेखन तर्क को hg absorbलाइनों के इतिहास का पालन करके लागू किया जाता है: यह मूल रूप से लिए गए दृष्टिकोण से अलग है hg histeditया git rebase, जो 3-तरह के विलय के आधार पर मर्ज की रणनीतियों पर भरोसा करने की प्रवृत्ति रखते हैं , एक फ़ाइल के नए संस्करण को प्राप्त करने के लिए कई इनपुट दिए गए संस्करणों।

इस दृष्टिकोण ने इस तथ्य के साथ जोड़ दिया कि एचजी ने अस्पष्ट आवेदन प्रतिबद्धताओं के साथ बदलावों पर स्किब्स को अवशोषित कर लिया है, जिसका मतलब है कि एचजी एब्जॉर्ब कभी मर्ज संघर्ष का सामना नहीं करेगा!

अब, आप सोच रहे होंगे कि यदि आप अस्पष्ट अनुप्रयोग लक्ष्यों के साथ लाइनों को अनदेखा करते हैं, तो पैच हमेशा क्लासिकल 3-मर्ज का उपयोग करके सफाई से लागू होगा। यह कथन तार्किक रूप से सही लगता है। लेकिन ऐसा नहीं है: hg absorbजब विलय hg histeditया प्रदर्शन git rebase -iविफल हो जाएगा , तो मर्ज संघर्ष से बच सकते हैं।


0

मुझे लगता है कि chistedit(Mercurial 2.3 के बाद से बनाया गया) rebase -iशुद्ध Mercurial ( chisteditयह संवादात्मक संस्करण है histedit) के सबसे करीब है । एक बार बचाव के लिए foldकमान के नक्शे को फिर से तैयार करने के लिए squashऔर rollकमान के नक्शे को फिर से भरने के लिए fixup। अधिक जानकारी के लिए histedit डॉक्स देखें ।

ये रहा एक सरल उदाहरण। मान लें कि आपके पास निम्नलिखित हैं और पिछले संशोधन में सभी 1e21c4b1 के परिवर्तनों को स्थानांतरित करना चाहते हैं और पिछले संशोधन के संदेश को ध्यान में रखते हुए।

@  1e21c4b1 drees tip
|  A commit you want to squash
o  b4a738a4 drees
|  A commit
o  788aa028 drees
|  Older stuff

आप hg chistedit -r b4a738a4इतिहास को b4a738a4 पर वापस संपादित करने के लिए चला सकते हैं । इसके बाद आप 1e21c4b1 पर कर्सर ले जाते हैं और rसंकेत करते हैं कि आप उस संशोधन को रोल करना चाहते हैं। ध्यान दें कि hvedit में ऑर्डर (सबसे पुराना से सबसे नया) से बदला गया है hg log(नवीनतम से सबसे पुराना)।

#0  pick   160:b4a738a49916   A commit
#1  ^roll  161:1e21c4b1500c

अपने परिवर्तनों को चुनने के बाद, आप फिर cउन्हें प्रतिबद्ध करना चुनते हैं। परिणाम निम्नलिखित है:

@ bfa4a3be पेड़ की नोक | एक प्रतिबद्ध ओ 788aa028 पेड़ | पुराना सामान

यदि आप उनके लिए अपेक्षाकृत नए हैं, तो इससे histeditबेहतर विकल्प हो सकता है chisteditक्योंकि यह संदर्भ के लिए histedit फ़ाइल में कमांड विवरण प्रदान करता है। सामान्य पाठ संपादन (सामान्य रीबेस की तरह) का उपयोग करके कमांड सेट करने में बस थोड़ा अधिक संपादन होता है।

ध्यान दें, histeditया तो उपयोग करने के लिए या chisteditआपको histeditअपने एक्सटेंशन को अपने ~ / .hgrc में जोड़ना होगा:

[extensions]
histedit =

मैंने सुझाव दिया chisteditकि यह rebase -iइतिहास में कहीं भी सबसे करीब है और काम करता है। यदि आप वास्तव में सिर्फ पिछले एक @ @ में वर्तमान संशोधन को सब्सक्राइब / ट्वीक करना चाहते हैं। डेमेकी का stripसुझाव अच्छा हो सकता है क्योंकि जो हो रहा है वह स्पष्ट है। यह Mercuria 2.8 के बाद से बनाया गया है। उपरोक्त परिणाम प्राप्त करने के लिए आप निम्न कार्य कर सकते हैं:

hg strip .
hg add
hg commit --amend

नोट strip, जैसे कि हेवडिट, को आपके ~ / .hgrc में सक्षम करने की आवश्यकता है:

[extensions]
strip =

0

चलो मान लेते हैं कि आप स्क्वैश (एकजुट) 2 सबसे हाल ही में करना चाहते हैं।

  1. एक संशोधन संख्या का पता लगाएं

    hg log -G -l 3
    

    संभव उत्पादन:

    @  changeset:   156:a922d923cf6f
    |  branch:      default
    |  tag:         tip
    |  user:        naXa!
    |  date:        Thu Dec 13 15:45:58 2018 +0300
    |  summary:     commit message 3
    |
    o  changeset:   155:5feb73422486
    |  branch:      default
    |  user:        naXa!
    |  date:        Thu Dec 13 15:22:15 2018 +0300
    |  summary:     commit message 2
    |
    o  changeset:   154:2e490482bd75
    |  branch:      default
    ~  user:        naXa!
       date:        Thu Dec 13 03:28:27 2018 +0300
       summary:     commit message 1
    
  2. नरम रीसेट शाखा

    hg strip --keep -r 155
    
  3. फिर से बदलाव करें

    hg commit -m "new commit message"
    

टिप्पणियाँ

stripसक्षम करने के लिए अंतर्निहित एक्सटेंशन की आवश्यकता होती है। ~/.hgrcनिम्नलिखित सामग्री के साथ कॉन्फिगर फाइल बनाएं / संपादित करें :

[extensions]
strip = 

-1

मैं उपयोग करता हूं:

hg phase --draft --force -r 267
...
hg rebase --dest 282 --source 267 --collapse
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.