Mercurial में सुविधा शाखा को सही ढंग से कैसे बंद करें?


240

मैंने एक सुविधा शाखा पर काम करना समाप्त कर दिया है feature-x। मैं इसके परिणाम से छुटकारा पाने के लिए परिणामों को वापस defaultशाखा में विलय करना चाहता हूं ।feature-xhg branches

मैं निम्नलिखित परिदृश्य के साथ आया था, लेकिन इसके कुछ मुद्दे हैं:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

तो feature-xशाखा (परिवर्तन 40- 41) बंद है, लेकिन एक नया प्रमुख है , समापन शाखा में बदलाव 44, जिसे hg headsहर समय सूचीबद्ध किया जाएगा :

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

अद्यतन : ऐसा लगता है कि संस्करण 1.5 के बाद से मर्क्यूरियल hg headsअब के आउटपुट में बंद शाखाओं के प्रमुख नहीं दिखाता है ।

क्या एक और सिर को छोड़कर बिना विलय वाली शाखा को बंद करना संभव है? क्या एक सुविधा शाखा को बंद करने का अधिक सही तरीका है?

संबंधित सवाल:


@Andrey: लेकिन लेख में बताया गया है कि केवल "- ब्रांच-शाखा" के बारे में बात नहीं की जाती है। यह आपकी शाखा को चुभाने के चार तरीके दिखाता है । यदि आप वास्तव में इसे अब और नहीं चाहते हैं, तो आप लेख में बताए अनुसार क्लोन कर सकते हैं। एकमात्र 'समस्या' अगर आप इसे बंद करना चाहते हैं तो किसी भी कारण से, फिर भी इसे अपने आसपास रखें।
SyntaxT3rr0r

1
@WizardOfOdds हां, मैंने मृत शाखाओं को छांटने पर पूरा लेख पढ़ा है। मैं चाहता हूं कि शाखा संशोधन इतिहास में बने रहे, न कि उसे फेंक दे। पहले मैंने सिर्फ फीचर शाखाओं को defaultबिना "बंद" किए उन्हें मर्ज कर दिया था। इसका परिणाम 0 नए प्रमुखों के रूप में सामने आया लेकिन ऐसी शाखाएँ hg branchesहमेशा के लिए (निष्क्रिय शाखाओं के रूप में) दिखाई दे रही थीं।
एंड्रे व्लास्लोविच

सुविधाओं को विकसित करने के लिए मैं संपूर्ण रिपॉजिटरी को क्लोन करता हूं और फिर फीचर समाप्त होने पर इसे वापस मर्ज करता हूं। मुझे इतिहास में (बंद) शाखाओं के अवशेष पसंद नहीं हैं।
डैनमैन

जवाबों:


218

एक तरीका सिर्फ मर्ज की गई सुविधा शाखाओं को खुला छोड़ना है (और निष्क्रिय):

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

एक अतिरिक्त तरीका एक अतिरिक्त प्रतिबद्ध का उपयोग करके विलय से पहले एक सुविधा शाखा को बंद करना है:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

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

अद्यतन : मर्क्यूरियल 1.5 के बाद से आप किसी भी समय शाखा को बंद कर सकते हैं, इसलिए यह दोनों hg branchesऔर hg headsअब में नहीं दिखाई देगा । केवल एक चीज जो आपको संभवतः परेशान कर सकती है, वह यह है कि तकनीकी रूप से संशोधन ग्राफ में अभी भी एक और संशोधन होगा, जिसमें बच्चे शामिल नहीं होंगे।

अद्यतन 2 : चूंकि मर्क्यूरियल 1.8 बुकमार्क मर्क्यूरियल की एक मुख्य विशेषता बन गया है। नामित शाखाओं की तुलना में बुकमार्क शाखा के लिए अधिक सुविधाजनक हैं। यह प्रश्न भी देखें:


2
यह जरूरी नहीं कि सच हो Bookmarks are more convenient for branching than named branches। Hg बुकमार्क Git शाखाओं के समान नहीं हैं। वे कई किनारे मामलों से भरे हुए हैं जो उन्हें फीचर शाखाओं के रूप में अनुपयुक्त बनाते हैं। उदाहरण के लिए: जब आप एक भंडार को क्लोन करते हैं तो आप defaultशाखा में नवीनतम प्रतिबद्ध के साथ समाप्त हो जाएंगे । यदि आप बुकमार्क का उपयोग करते हैं, तो यह बदलाव यादृच्छिक (अस्थिर) बुकमार्क से मेल खाता है। यदि आप नामित शाखाओं का उपयोग करते हैं, तो आपको स्थिर / डिफ़ॉल्ट शाखा में नवीनतम प्रतिबद्ध मिलेगा, जो आमतौर पर आप चाहते हैं। बुकमार्क्स एक दिन वहाँ मिल जाएगा, लेकिन वे अभी तक वहाँ नहीं हैं।
गिली

मैं निजी टैग के रूप में बुकमार्क का उपयोग करता हूं जो केवल मेरे स्थानीय भंडार में दिखाई देते हैं। वे उन परिवर्तनों के अनुस्मारक के रूप में कार्य करते हैं जिन्हें मुझे फिर से करने की आवश्यकता है।
गिली

मैंने इस दृष्टिकोण का पालन करने की कोशिश की, लेकिन मुझे अभी भी एक त्रुटि मिलती है जब धक्का देने की कोशिश की जाती है abort: push creates new remote branches::। मैं क्या गलत कर सकता था?
कैस्परल्ड

79

imho शाखाओं के दो मामले हैं जो बंद करना भूल गए

केस 1: शाखा को डिफ़ॉल्ट में विलय नहीं किया गया था

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

hg up myBranch
hg commit --close-branch

केस 2: शाखा को डिफ़ॉल्ट में विलय कर दिया गया था

यह मामला केस 1 से बहुत अलग नहीं है और इसे केस 1 और दो अतिरिक्त लोगों के लिए चरणों को पुन: प्रस्तुत करके हल किया जा सकता है।

इस मामले में मैं शाखा में बदलाव करने के लिए अद्यतन करता हूं, --close- शाखा के साथ एक और प्रतिबद्ध करता हूं और नए बदलाव को मर्ज करता हूं जो डिफ़ॉल्ट रूप से टिप बन गया है। अंतिम ऑपरेशन एक नया टिप बनाता है जो डिफ़ॉल्ट शाखा में है - HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

आशा है कि यह भविष्य के पाठकों की मदद करेगा।


3
मेरे जैसे मर्क्यूरियल नौसिखिया के लिए अच्छा स्पष्ट उत्तर। और "ci" जो एचजी मदद से कोई एक आदेश के रूप में सूचीबद्ध नहीं है, का उपयोग नहीं करने के लिए धन्यवाद, इसलिए मैं नहीं जानता कि इसका क्या मतलब :)
एमबी।

8
@ एमबी .: ऐसे मामलों में, hg help ciआपको यह समझाएगा।
क्रिस मॉर्गन

मुझे विश्वास है कि 'hg मर्ज' कमांड आपको बताएगा, अंत में अभी भी एक और प्रतिबद्ध है
चिप ग्रैंडिट्स

11

संपादित करें , बहुत देर हो चुकी है ... मुझे पता है कि आपकी टिप्पणी पढ़ते हुए कहा गया है कि आप फ़ीचर-एक्स में परिवर्तन करना चाहते हैं, इसलिए यहाँ क्लोनिंग का काम नहीं करता है।

मैं अभी भी इसका जवाब यहां दूंगा, क्योंकि इससे दूसरों को मदद मिल सकती है।

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

जहां तक ​​मैं समझता हूं कि आपके पास यह है और एक बार और सभी के लिए "फीचर-एक्स" सिर से छुटकारा पाना चाहते हैं:

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

तो आप ऐसा करें:

hg clone . ../cleanedrepo --rev 7

और आपके पास निम्नलिखित होंगे, और आप देखेंगे कि फीचर-एक्स वास्तव में चला गया है:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

मुझे गलतफहमी हो सकती है कि आप क्या चाहते हैं, लेकिन कृपया इसे कम न करें, मुझे आपके उपयोग के मामले को पुन: प्रस्तुत करने में समय लगा:)


7

यह अजीब है, कि किसी ने अभी तक एक फीचर शाखाओं को बंद करने का सबसे मजबूत तरीका नहीं सुझाया है ... आप सिर्फ - क्लोज-ब्रांच फ्लैग के साथ मर्ज कमिट जोड़ सकते हैं (यानी संशोधित फाइलें और शाखा को एक साथ बंद करें):

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

तो, यह सब है। बगावत पर कोई अतिरिक्त सिर नहीं। कोई अतिरिक्त प्रतिबद्ध नहीं।


मैंने अपने उत्तर में इसका उल्लेख किया है: "" "कोई भी अंतिम वास्तविक कमिटमेंट को फीचर ब्रांच में जोड़ सकता है - एक्स्ट्रा-ब्रांच का उपयोग करके इस अतिरिक्त कमिट के साथ, लेकिन किसी को पहले से पता होना चाहिए कि कौन सा कमिट अंतिम होगा।" "
एंड्रे व्लास्लोविच शे

ठीक है मैं समझा। मैं अभी वाक्य के अंतिम भाग को नहीं समझता ("लेकिन एक को जानना चाहिए ..."), तो मैंने सोचा कि इसका मतलब कुछ अलग है। इसके अलावा, मैं यह नोट करना चाहूंगा कि यह विधि ज्यादातर GUI टूल (TortoiseHG, SourceTree आदि) द्वारा समर्थित नहीं है।
तव

@AndreyVlasovskikh इस उत्तर का उद्देश्य फीचर शाखा की अंतिम प्रतिबद्धताओं के बजाय मर्ज में शाखा को बंद करना है।
कास्परड

@tav mergeकमांड जारी करने से पहले यह hg branchसत्यापित करना एक अच्छा विचार हो सकता है कि मर्ज का शाखा नाम वह है जिसे आप खुला रखना चाहते हैं।
कैस्परर्ड

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