विलयन: अंतिम वचन में संशोधन कैसे करें?


211

मैं git commit --amendमर्क्यूरियल के एक काउंटर-पार्ट की तलाश कर रहा हूं , यानी उस तरीके को संशोधित करने का जो मेरी वर्किंग कॉपी से जुड़ा हुआ है। मुझे केवल अंतिम प्रतिबद्ध में दिलचस्पी है, न कि पहले की गई प्रतिबद्धताओं में।

इस संशोधन-प्रक्रिया की आवश्यकताएं हैं:

  • यदि संभव हो तो, इसे किसी भी एक्सटेंशन की आवश्यकता नहीं होनी चाहिए। इसके लिए नॉन-डिफॉल्ट एक्सटेंशन यानी एक्सटेंशन की जरूरत नहीं है, जो कि आधिकारिक मर्क्यूरियल इंस्टॉलेशन के साथ नहीं आता है।

  • अगर संशोधन के लिए प्रतिबद्ध मेरी वर्तमान शाखा का एक प्रमुख है, तो कोई नया प्रमुख नहीं बनाया जाना चाहिए। यदि कमेटी प्रमुख नहीं है, तो नया हेड बनाया जा सकता है।

  • यह प्रक्रिया इस तरह से सुरक्षित होनी चाहिए कि यदि किसी भी कारण से संशोधन विफल हो जाए, तो मैं चाहता हूं कि संशोधन के पहले की तरह ही कार्यशील प्रतिलिपि और भंडार राज्य बहाल हो। दूसरे शब्दों के साथ, यदि संशोधन स्वयं विफल हो सकता है, तो कार्य की प्रतिलिपि और रिपॉजिटरी राज्य को पुनर्स्थापित करने के लिए एक विफल-सुरक्षित प्रक्रिया होनी चाहिए। मैं "विफलताओं" का उल्लेख कर रहा हूं, जो संशोधन-प्रक्रिया (जैसे संघर्षों) की प्रकृति में निहित है, न कि फाइल-सिस्टम से संबंधित समस्याओं (एक्सेस प्रतिबंधों की तरह, लेखन के लिए एक फ़ाइल को लॉक करने में सक्षम नहीं होने के कारण ... )

अद्यतन (1):

  • प्रक्रिया स्वचालित होनी चाहिए , इसलिए इसे GUI क्लाइंट द्वारा बिना किसी उपयोगकर्ता सहभागिता के आवश्यक रूप से प्रदर्शित किया जा सकता है।

अद्यतन (2):

  • कार्यशील निर्देशिका में फ़ाइलों को स्पर्श नहीं किया जाना चाहिए (कुछ संशोधित फ़ाइलों पर फ़ाइल सिस्टम लॉक हो सकता है)। इसका विशेष रूप से मतलब है, कि किसी भी दृष्टिकोण पर एक संभावित दृष्टिकोण को एक स्वच्छ कार्य निर्देशिका की आवश्यकता हो सकती है।

जवाबों:


289

मर्क्यूरियल 2.2 के रिलीज के साथ , आप वर्तमान कार्य निर्देशिका के साथ अंतिम प्रतिबद्ध को अद्यतन करने के लिए --amendविकल्प का उपयोग कर सकते हैंhg commit

से कमांड लाइन संदर्भ :

--Amend ध्वज का उपयोग नई निर्देशिका के साथ काम करने वाले निर्देशिका के माता-पिता को संशोधित करने के लिए किया जा सकता है, जिसमें वर्तमान में hg स्थिति द्वारा रिपोर्ट किए गए के अलावा माता-पिता में परिवर्तन होते हैं, यदि कोई हो। पुरानी प्रतिबद्ध एक बैकअप बंडल में .hg / पट्टी-बैकअप (hg मदद बंडल और hg इसे पुनर्स्थापित करने के तरीके पर असहनीय मदद देखें) में संग्रहीत है।

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

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


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

5
अंतिम कमेंट पर संदेश को अपडेट करने के लिए: hg प्रतिबद्ध --amend -m "यह मेरा नया संदेश है"
Jay Sheth

52

Mercurial में आपके पास संपादन संपादित करने के लिए 3 विकल्प हैं:

  1. hg strip --keep --rev -1अंतिम (1) प्रतिबद्ध (ओं) को पूर्ववत करें, ताकि आप इसे फिर से कर सकें ( अधिक जानकारी के लिए यह उत्तर देखें)।

  2. एमक्यू एक्सटेंशन का उपयोग करना , जिसे मर्क्यूरियल के साथ शिप किया गया है

  3. यहां तक ​​कि अगर यह मर्क्यूरियल के साथ नहीं भेजा जाता है, तो हेवेडिट एक्सटेंशन ध्यान देने योग्य है

आप मर्क्यूरियल विकि के संपादन इतिहास पृष्ठ पर भी नज़र डाल सकते हैं ।

संक्षेप में, संपादन इतिहास वास्तव में कठिन और हतोत्साहित करने वाला है । और अगर आपने पहले ही अपने बदलावों को आगे बढ़ा दिया है, तो आपके द्वारा अन्य सभी क्लोनों पर कुल नियंत्रण होने के अलावा, बमुश्किल कुछ भी नहीं हो सकता है।

मैं वास्तव में git commit --amendकमांड से परिचित नहीं हूं , लेकिन AFAIK, Histedit वही है जो निकटतम दृष्टिकोण प्रतीत होता है, लेकिन दुख की बात है कि इसे Mercurial के साथ नहीं भेजा गया है। एमक्यू वास्तव में उपयोग करने के लिए जटिल है, लेकिन आप इसके साथ लगभग कुछ भी कर सकते हैं।


1
मुझे यकीन नहीं है कि मैं क्यों रोलबैक से चूक गया, लेकिन ऐसा लगता है कि (लगभग) मुझे क्या चाहिए। एकमात्र समस्या यह है, जब किसी फ़ाइल को मेरी मूल समिति के लिए हटा दिया गया है और इसे मेरी संशोधित समिति के लिए पुनर्जीवित कर दिया गया है: रोलबैक से पहले यह बिना लिखा हुआ होगा, रोलबैक के बाद, इसे हटाने के लिए शेड्यूल किया जाएगा (लेकिन फ़ाइल मौजूद नहीं है) कार्यशील निर्देशिका)
mstrap

@Marc मुझे यकीन नहीं है कि मैं आपकी समस्या को समझ सकता हूँ, लेकिन भूल आज्ञा पर एक नज़र है, मुझे लगता है कि यह वही है जो आप खोज रहे हैं।
क्रतुटेक

मुझे नहीं लगता कि "भूलना" यहाँ मददगार होगा। यहाँ अधिक विस्तार से समस्या है: (1) मैं संशोधन 2 पर हूँ (2) "फ़ाइल" निकालें और कुछ अन्य परिवर्तन (3) परिवर्तन करें, जिसके परिणामस्वरूप संशोधन 3 (4) अब मैं अपना विचार बदलूंगा और निर्णय लूंगा "फाइल" को कमिट से नहीं हटाया जाना चाहिए, इसलिए मैं संशोधन करना चाहता हूं। 3. इसलिए, मैं "फाइल" को फिर से जोड़ूंगा, जो अब अनवांटेड है (5) अब मैं रोलबैक करता हूं: यह रिसेट और मार्क को रीसेट करेगा " फ़ाइल "हटा दी गई है। (६) अब "एचजी कमिट" करने के बाद, "फाइल" को हटा दिया जाएगा, हालाँकि यह अब नहीं होना चाहिए। उस तरह के लिए एक स्वचालित सुधार कैसे हो सकता है?
mstrap

1
स्वचालित भाग के लिए मुझे नहीं पता, लेकिन आप hg revert myfileविलोपन को पूर्ववत करने के लिए कर सकते हैं । हो सकता है कि काम hg addकरने के बाद फ़ाइल के साथ फिर से जोड़ना rollback
krtek

3
मैं सहमत हूं कि प्रकाशित परिवर्तनों के संपादन इतिहास से बचा जाना चाहिए, लेकिन मेरे स्थानीय इतिहास का संपादन एक डीवीसीएस का मुख्य आकर्षण है। अपने qimport के साथ MQ शुद्ध इतिहास-संपादन, AFAICT है।
mstrap

38

जीयूआई के लिए बराबर hg commit --amend:

यह भी TortoiseHG के GUI से काम करता है (मैं v2.5 का उपयोग कर रहा हूँ):

'कमिट' दृश्य में स्वाइच करें या कार्यक्षेत्र दृश्य में, 'वर्किंग डाइरेक्टरी' प्रविष्टि का चयन करें। 'कमिट' बटन में 'संशोधन वर्तमान संशोधन' नाम का एक विकल्प है (इसे खोजने के लिए बटन के ड्रॉप-डाउन तीर पर क्लिक करें)।

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

          ||
          ||
          \/

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

कैविएट एमप्टर :

यह अतिरिक्त विकल्प केवल तभी सक्षम होगा जब मर्क्यूरियल संस्करण कम से कम 2.2.0 हो, और यदि वर्तमान संशोधन सार्वजनिक नहीं है, तो यह पैच नहीं है और इसके कोई बच्चे नहीं हैं। [...]

बटन पर क्लिक करने से संशोधन करने के लिए 'कमिट - मेमेंड' कहलाएगा।

THG देव चैनल पर इसके बारे में अधिक जानकारी


बहुत मददगार, धन्यवाद। THG स्मार्ट है जो पूर्व प्रतिबद्ध से संदेश के लिए प्रतिबद्ध (संशोधन) संदेश को डिफ़ॉल्ट करता है - बस मुझे जो चाहिए था।
उउउद्ल्र्ल्र्स

7

मैं क्या krtek लिखा है में ट्यूनिंग हूँ। अधिक विशेष रूप से समाधान 1:

मान्यताओं:

  • आपने एक (!) परिवर्तन किया है लेकिन अभी तक इसे आगे नहीं बढ़ाया है
  • आप इस बदलाव को संशोधित करना चाहते हैं (उदाहरण के लिए, फ़ाइलों को हटाने या बदलने और / या प्रतिबद्ध संदेश)

उपाय:

  • hg rollbackअंतिम प्रतिबद्ध को पूर्ववत करने के लिए उपयोग करें
  • जगह में नए बदलाव के साथ फिर से प्रतिबद्ध

रोलबैक वास्तव में अंतिम ऑपरेशन को पूर्ववत करता है। काम करने का इसका तरीका काफी सरल है: एचजी में सामान्य ऑपरेशन केवल फाइलों में संलग्न होंगे; इसमें एक कमिट शामिल है। मर्क्यूरियल अंतिम लेन-देन की फ़ाइल लंबाई का ट्रैक रखता है और इसलिए पूरी तरह से फ़ाइलों को उनकी पुरानी लंबाई में वापस करने के लिए एक कदम पूर्ववत कर सकता है।


1
ट्यूनिंग समाधान (1) के लिए धन्यवाद; रोलबैक के साथ अभी एक छोटी सी समस्या बाकी है, कृपया krtek के समाधान पर मेरी टिप्पणी देखें।
mstrap

8
रोलबैक पर जोर देने के लिए एक बात, क्योंकि यह लोगों को पकड़ता है, यह है कि यह रेपो पर अंतिम लेनदेन है जो अंतिम बार वापस नहीं होता है। इसलिए अगर किसी और चीज ने रेपो को लिखा है, तो रोलबैक मदद नहीं करेगा। यह याद रखने के लिए एक सूक्ष्म लेकिन महत्वपूर्ण बात है। रोलबैक विंडो बंद होने के बाद MQ और histedit मदद कर सकते हैं, लेकिन फिर भी केवल एक निश्चित बिंदु तक।
पॉल एस

7

यह मानते हुए कि आपने अभी तक अपने परिवर्तनों का प्रचार नहीं किया है, यहाँ आप क्या कर सकते हैं।

  • अपने .hgrc में जोड़ें:

    [extensions]
    mq =
    
  • आपके भंडार में:

    hg qimport -r0:tip
    hg qpop -a
    

    बेशक, आपको अंतिम शून्य (केवल hg qpopनीचे देखें) पॉप के लिए संशोधन शून्य या पॉप सभी पैच के साथ शुरू करने की आवश्यकता नहीं है ।

  • .hg/patches/seriesफ़ाइल में अंतिम प्रविष्टि , या पैच जिसे आप पसंद नहीं करते हैं हटा दें । पुन: व्यवस्थित करना भी संभव है।

  • hg qpush -a; hg qfinish -a
  • .diffअभी भी .hg / पैच (आपके मामले में एक होना चाहिए) फ़ाइलों को हटा दें (अनपेक्षित पैच)।

यदि आप नहीं करना चाहते करने के लिए सभी वापस ले अपने पैच के लिए, आप इसे का उपयोग करके संपादित कर सकते हैं hg qimport -r0:tip(या समान), फिर संपादन सामान और उपयोग hg qrefreshअपने ढेर पर सर्वोच्च पैच में परिवर्तन मर्ज करने के लिए। पढ़ें hg help qrefresh

संपादन करके .hg/patches/series, आप कई पैच भी हटा सकते हैं, या कुछ को फिर से व्यवस्थित कर सकते हैं। यदि आपका अंतिम संशोधन 99 है, तो आप अभी उपयोग कर सकते हैं hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a

बेशक, यह प्रक्रिया अत्यधिक हतोत्साहित और जोखिम भरी है । ऐसा करने से पहले हर चीज का बैकअप बना लें !

एक विचार के रूप में, मैंने इसे निजी-केवल रिपॉजिटरी पर कई बार किया है।


मैंने mq-extension का उपयोग करने पर भी विचार किया था, हालाँकि इसके लिए बहुत से परिचालनों की आवश्यकता होती है जिसके लिए उनमें से कुछ विफल हो सकते हैं (जैसे यदि बाइनरी फाइलें शामिल हैं)। इसके अलावा, .hg / पैच / सीरीज़ को संपादित करना स्वीकार्य नहीं होगा, क्योंकि इस प्रक्रिया का उपयोग GUI क्लाइंट के भीतर किया जाना चाहिए (मैंने उपरोक्त आवश्यकताओं को अपडेट किया है)
mstrap

हम्म, खेद है कि यह आपके लिए नहीं होगा, एक निजी भंडार पर यह वास्तव में गधा (बैकअप के साथ - मैंने पहले ही वसाफिंगर को नष्ट कर दिया है ^ ^ के साथ एक प्रतिनिधि को नष्ट कर दिया)। पैच का संयोजन करने से पहले स्थानीय बदलावों का उपयोग करने से पहले यह काफी अच्छा है hg qfold, btw
hochl

MQ का उपयोग करने के लिए +1, लेकिन मुझे लगता है कि आप ओवरबोर्ड जा चुके हैं। वह केवल अंतिम वचन में संशोधन करने के बारे में पूछ रहा है। इसके अलावा मर्ज के गिरते ही आयात खत्म हो जाएगा। 'क्यूमपोर्ट -आर टिप; <संपादित करें सामान>; क्रेफ्रेश-ई; qfin -a 'काम करेगा (-क्या संदेश को संपादित करने के लिए)
पॉल एस

सच है, मर्ज एक समस्या है, मैं आमतौर पर केवल एक पैच और उपयोग करता हूं hg import -r<prev>:tip। एक किटी में पिछले संस्करण के लिए कोई शॉर्टकट नहीं है, जैसे तोड़फोड़ में।
hochl

2

मर्क्यूरियल के हालिया संस्करणों में वह evolveएक्सटेंशन शामिल है जो hg amendकमांड प्रदान करता है । यह आपके संस्करण नियंत्रण में पूर्व-संशोधन इतिहास को खोए बिना एक प्रतिबद्ध संशोधन की अनुमति देता है।

एचजी संशोधन [विकल्प] ... [फ़ाइल] ...

उपनाम: ताज़ा करें

अपडेट के साथ एक बदलाव को संयोजित करें और इसे एक नए के साथ बदलें

Commits a new changeset incorporating both the changes to the given files
and all the changes from the current parent changeset into the repository.

See 'hg commit' for details about committing changes.

If you don't specify -m, the parent's message will be reused.

Behind the scenes, Mercurial first commits the update as a regular child
of the current parent. Then it creates a new commit on the parent's
parents with the updated contents. Then it changes the working copy parent
to this new combined changeset. Finally, the old changeset and its update
are hidden from 'hg log' (unless you use --hidden with log).

विस्तार के पूर्ण विवरण के लिए https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve देखें evolve


एक ही प्रतिबद्ध संदेश का फिर से उपयोग करना एक अच्छी सुविधा है!
म्पेन

1

मूल प्रश्न में सभी समस्याओं को हल नहीं किया जा सकता है, लेकिन चूंकि यह इस बात पर वास्तविक तथ्य है कि कैसे व्यापारी पिछली प्रतिबद्धताओं में संशोधन कर सकते हैं, मैं अपनी 2 सेंट की जानकारी जोड़ूंगा।

यदि आप मेरे जैसे हैं, और बिना किसी फाइल को जोड़े केवल पिछले प्रतिबद्ध संदेश (एक टाइपो को ठीक करना) को संशोधित करना चाहते हैं, तो यह काम करेगा

hg commit -X 'glob:**' --amend

hg commitडिफ़ॉल्ट रूप से किसी भी शामिल या बहिष्कृत पैटर्न के बिना कार्यशील निर्देशिका में सभी फाइलें शामिल होंगी। पैटर्न लागू करना -X 'glob:**'सभी संभव फ़ाइलों को बाहर कर देगा, केवल प्रतिबद्ध संदेश को संशोधित करने की अनुमति देगा।

कार्यात्मक रूप से यह git commit --amendतब होता है जब सूचकांक / चरण में कोई फाइल नहीं होती है।


0

एक अन्य समाधान uncommitवर्तमान फ़ाइल को वर्तमान प्रतिबद्ध से बाहर करने के लिए कमांड का उपयोग कर सकता है ।

hg uncommit [file/directory]

यह तब बहुत मददगार होता है जब आप करंट कमेट रखना चाहते हैं और कमिट से कुछ फाइल को डिसेलेक्ट करना चाहते हैं (खासकर files/directoriesडिलीट होने के लिए मददगार )।

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