मेरे पास कमिट्स की एक जोड़ी है जो वास्तव में सिर्फ एक होनी चाहिए। अगर मैं git का उपयोग कर रहा था, तो मैं उपयोग करूंगा:
git rebase -i <some-commit-before>
और फिर उन्हें स्क्वाश करें।
क्या मैं ऐसा कर सकता हूं? यदि हां, तो कैसे?
मेरे पास कमिट्स की एक जोड़ी है जो वास्तव में सिर्फ एक होनी चाहिए। अगर मैं git का उपयोग कर रहा था, तो मैं उपयोग करूंगा:
git rebase -i <some-commit-before>
और फिर उन्हें स्क्वाश करें।
क्या मैं ऐसा कर सकता हूं? यदि हां, तो कैसे?
जवाबों:
हाँ, आप से किसी भी एक्सटेंशन के बिना इस तेज का उपयोग कर सकते श्रृंखलाबद्ध changesets ।
यदि आप एक एक्सटेंशन का उपयोग करना चाहते हैं, तो वैकल्पिक रूप से:
मेरा पसंदीदा hg strip --keepकमांड है। और फिर मैं एक कमिटमेंट में सभी बदलाव करता हूं।
यह मेरे लिए सबसे तेज़ और सबसे आरामदायक तरीका है, क्योंकि मैं अपने दैनिक काम के दौरान कई छोटे-छोटे काम करना पसंद करता हूं;)
नोट 1: सक्षम करने के लिए stripएक अंतर्निहित विस्तार की आवश्यकता है mq।
नोट 2: मेरा पसंदीदा Git / Mercurial ग्राहक (SmartGit / Hg) डिफ़ॉल्ट --keepपैरामीटर द्वारा अपग्रेड करता है strip। और क्या और भी अधिक सुविधाजनक है: यह नामक विकल्प प्रदान करता है join commits:]
hg strip --keep --rev [rev] जहां revआप पिछले एक के साथ स्क्वैश करना चाहते हैं
--revhg strip --keep [rev]
hg help stripदेता है hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..., और छूट संशोधन मुझे देता है abort: empty revision set।
hg stripसबसे अच्छा विचार नहीं है। यह बिल्कुल सुरक्षित नहीं है। कोशिश करो hg histedit, शायद विकसित विस्तार का उपयोग करके भी प्रयास करें।
रिबेस विस्तार एक आकर्षण की तरह काम किया। 2 स्क्वैश करने के लिए:
$ hg rebase --dest .~2 --base . --collapse
डॉट वर्तमान संशोधन के लिए एक शॉर्टकट है।
जब आप कुछ शाखा पर होते हैं तो यह और भी आसान हो जाता है और उन सभी को एक में समेटना चाहता है:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
यह कैसे काम करता है:

( http://mercurial-scm.org/wiki/RebaseExtension#Collapsing से )
यदि आप इस उत्तर को पढ़ रहे हैं, तो आप इस उत्तर में उल्लिखित हर दूसरे विकल्प को भूल सकते हैं और विकसित एक्सटेंशन
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रिबेस का विकल्प इसे कवर करता है (इसके बाद संशोधन को गुप्त के रूप में चिह्नित किया जाता है, या परिणाम की जांच करने के बाद उन पर पट्टी का उपयोग करके)। यहां तक कि दो विद्रोह आदेशों के अनुक्रम के साथ अन्य संशोधनों के बीच चल रहे संशोधन संभव हैं।
मर्क्यूरियल 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विफल हो जाएगा , तो मर्ज संघर्ष से बच सकते हैं।
मुझे लगता है कि 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 =
चलो मान लेते हैं कि आप स्क्वैश (एकजुट) 2 सबसे हाल ही में करना चाहते हैं।
एक संशोधन संख्या का पता लगाएं
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
नरम रीसेट शाखा
hg strip --keep -r 155
फिर से बदलाव करें
hg commit -m "new commit message"
stripसक्षम करने के लिए अंतर्निहित एक्सटेंशन की आवश्यकता होती है। ~/.hgrcनिम्नलिखित सामग्री के साथ कॉन्फिगर फाइल बनाएं / संपादित करें :
[extensions]
strip =