मर्क्यूरियल चाल एक नई शाखा में बदल जाती है


124

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


जवाबों:


153

जैसा कि मार्क ने सुझाव दिया है, MqExtension आपकी समस्या का एक समाधान है। IMHO एक सरल वर्कफ़्लो है रिबास एक्सटेंशन का उपयोग करने के लिए । मान लीजिए कि आपका इतिहास इस तरह है:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

इसका मतलब है, संशोधन 0वह आधार है जिस पर आपने अपनी सुविधा पर काम करना शुरू किया था। अब आप 1-2एक नामित शाखा पर संशोधन करना चाहते हैं , आइए बताते हैं my-feature। संशोधन 0और उस शाखा को बनाने के लिए अपडेट करें :

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

इतिहास अब इस तरह दिखता है:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

rebaseसंशोधन 1-2पर संशोधन के लिए आदेश का उपयोग करें 3:

$ hg rebase -s 1 -d 3

यह निम्नलिखित ग्राफ में परिणाम देता है:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

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


4
IMHO इस समाधान का दोष यह है कि यह "स्टार्ट न्यू ब्रांच माय-फीचर" डमी कमिट (यानी जो किसी भी फाइल को नहीं बदलता है) का परिचय देता है।
sschuberth

9
@sschuberth: मुझे लगता है कि स्पष्ट होना यहाँ एक अच्छी बात है। यदि अतिरिक्त बदलाव आपके लिए एक समस्या है, तो इसे सफल के साथ मिलाएं (जैसे foldकि अब अंतर्निहित हेंडविट एक्सटेंशन की कमांड का उपयोग करके )।
ओबेन सोनने

6
@AmirRachum: hg log -G( ग्रेफ्लोगेक्स्टेंशन )। मैंने मैन्युअल रूप से कुछ लाइनें छीन ली हैं, लेकिन यह कस्टम लॉग शैलियों का उपयोग करके पूरी तरह से स्वचालित रूप से प्रदान किया जा सकता है ।
ओबेन सोन ने

2
सक्षम रिबेस : विस्तार mercurial.selenic.com/wiki/RebaseExtension#Configuration
56ka

1
@sschuberth मैं सहमत हूं। मेरा समाधान यह है कि आपके गैर-डमी को डमी कमिट के माता-पिता के साथ --keepbranches ध्वज के साथ फिर से शुरू करें, और फिर hg को आपकी डमी प्रतिबद्ध करें। यह एक शाखा का नाम बदलने के लिए बहुत काम है, लेकिन कभी-कभी मर्क्यूरियल उस तरह गूंगा होता है।
वेबर 2

30

आप MqExtension का उपयोग कर सकते हैं । मान लें कि परिवर्तन करने के लिए परिवर्तन 1-3 हैं:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches

मैं 63:64 और 66:68 आयात करना चाहता हूं। मुझे संशोधन ६५ मिल रहा है ६५ का जनक नहीं है
केसबश १२'११

65 के साथ क्या करना चाहते हैं? Mq केवल एक सिर से लगातार परिवर्तन कर सकता है। यह सामान्य रूप से अपरिवर्तनीय परिवर्तन को परिवर्तनशील पैच में बदल देता है जिसे संपादित किया जा सकता है। यह हैश को बदलता है (सभी बच्चों को प्रभावित करता है), इसलिए आप छोड़ नहीं सकते।
मार्क टॉलेनन

मेरे पास कई परिवर्तन हैं (65 सहित) जो मैंने मुख्य शाखा में किए और धक्का दिया
केसबश

1
उन परिवर्तनों को संपादित न करें जिन्हें धक्का दिया गया है। Mq ने हैश को बदल दिया है इसलिए वे प्रभावी रूप से नए बदलाव होंगे। केवल वह इतिहास संपादित करें जिसे धक्का नहीं दिया गया है।
मार्क तोलोनन

यदि आपने पहले ही 65 को धक्का दे दिया है, तो आपको सबसे निश्चित रूप से 63 और 64 को स्थानांतरित नहीं करना चाहिए, और बस 66:68 को स्थानांतरित करने के लिए व्यवस्थित करें (फिर से, केवल अगर आपने उन्हें धक्का नहीं दिया है)।
मैट

9

मैं मार्क टोलोनन द्वारा यहाँ वर्णित पैच समाधान पसंद करता हूँ

जो मेरे पास है:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

मैं क्या चाहता हूँ:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

व्यापारिक आदेश:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

यहाँ मेरे स्थानीय भंडार का राज्य है

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

अब मुझे अपनी डिफ़ॉल्ट शाखा से संशोधन 2 2 और 3 को हटाने की आवश्यकता है। आप इसे mq के एक्सटेंशन से स्ट्रिप कमांड के साथ कर सकते हैं। hg stripपरिवर्तनकर्ता और उसके सभी वंशों को भंडार से निकाल देता है।

अपनी कॉन्फ़िगरेशन फ़ाइल (.hgrc या Mercurial.ini) में निम्न पंक्तियों को जोड़कर एक्सटेंशन सक्षम करें:

vim ~/.hgrc और जोड़ :

[extensions]
mq =

और अब इस रिपॉजिटरी को संशोधन 1 पर पट्टी करें।

hg strip 1

और यहाँ हम हैं

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

नोट: परिवर्तन अलग-अलग हैं लेकिन संशोधन समान हैं


5

GUI का उपयोग करने के इच्छुक लोगों के लिए

  1. Tortoise Hg-> File- -> पर जाएं Settingsफिर टिक करें rebase

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

  1. कछुआ UI पुनः आरंभ करें

  2. नई शाखा बनाएँ जहाँ आप परिवर्तनशील होंगे। वर्तमान शाखा नाम पर क्लिक करें -> चुनें Open a new named branch-> शाखा नाम चुनें।

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

  1. यदि आप जो परिवर्तन करना चाहते हैं, वह नहीं किया गया है public(उदाहरण के लिए draft) 5. पर जाएं (यदि परिवर्तन पहले ही प्रकाशित हो चुके हैं और आप वरिष्ठ देव नहीं हैं, तो आपको किसी वरिष्ठ से बात करनी चाहिए) , मैं कोई जिम्मेदारी नहीं लेता :))।

पर जाएं View> - Show Console(या Ctrl+ L) तो कंसोल में लिखने hg phase -f -d 2- जहां 2 न्यूनतम संशोधन है आप नई शाखा में स्थानांतरित हो जाएगी।

  1. शाखा और संशोधन पर जाएं (यदि आप चरण 3 में बनाई गई नई शाखा में परिवर्तन कर रहे हैं, तो सबसे ऊपर संशोधन होना चाहिए) Right Mouse->Update

  2. शाखा और पुनर्विचार पर जाएं Right Mouse- आप -> Modify History-> से परिवर्तन लाएंगेRebase

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

  1. क्लिक करें Rebaseऔर प्रार्थना करें कि कोई संघर्ष नहीं है, यदि आप अवश्य मिलें।

  2. पुश परिवर्तन, इस बिंदु पर सभी संशोधन अभी भी होने चाहिए draft

  3. जिस शाखा में आप परिवर्तन कर रहे थे, उसमें सबसे ऊपरी संशोधन पर जाएँ Right Mouse-> Change Phase to-> Public

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

आशा है कि यह आपको कुछ समय बचाता है।


अच्छा काम! यह कोशिश करने के लिए जा रहा है, बस एक सवाल हालांकि - क्यों अंत में सार्वजनिक करने के लिए चरण को बदलना? "दूरस्थ रिपॉजिटरी में देखा गया कोई भी परिवर्तन सार्वजनिक है" इसलिए जब आप धक्का देते हैं तो इसे वैसे भी सार्वजनिक नहीं किया जाएगा?
जोशुआ डक्सबरी

@JoshLeeDucks धक्का देने पर वे स्वचालित रूप से publicअब (कम से कम मेरे लिए वे नहीं करते हैं) में नहीं बदलते हैं ।
मैट वैटकेविसियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.