2009-09-10 11 views
46

में रिलीज शाखाओं का प्रबंधन हाल ही में मैंने एसवीएन से Mercurial में स्विच किया। अब मुझे आश्चर्य है कि अच्छे अभ्यास के अनुसार मर्कुरियल में मेरे इच्छित ब्रांचिंग कार्य प्रवाह को कैसे महसूस किया जाए, उम्मीद है कि अन्य डेवलपर्स को यह समझने की उम्मीद है कि भंडार में क्या होता है।Mercurial

  1. आमतौर पर मैं एक ट्रंक/डिफ़ॉल्ट शाखा जहां मौजूदा रिलीज श्रृंखला पर काम होता है:

    इस काम प्रवाह है। मान लें कि 1.x है। उसी समय मैं अगली बड़ी रिलीज पर काम करने के लिए शाखा 2.x का उपयोग करता हूं। इस शाखा में परिवर्तन कट्टरपंथी हो सकते हैं, इसलिए ट्रंक/डिफ़ॉल्ट/1.x शाखा के साथ विलय करना कोई समझ नहीं आता है।

    • 2.x पर थोड़ी देर के काम के बाद समाप्त हो सकता है और संस्करण 2.0 जारी हो जाता है। अब मैं चाहता हूं कि 2.x शाखा नई डिफ़ॉल्ट/ट्रंक शाखा हो और वर्तमान डिफ़ॉल्ट/ट्रंक 1.x शाखा हो।
    • इस प्रक्रिया को दोहराते हुए, एक नई 3.x शाखा आ सकती है। पहले की तरह, यदि 3.0 जारी हो जाता है, तो 3.x को नई डिफ़ॉल्ट शाखा बननी चाहिए जबकि तत्कालीन वर्तमान डिफ़ॉल्ट 2.x शाखा (फिर से) बननी चाहिए।

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

$ hg init 
$ echo "hello world" > file1.txt 
$ hg ci -A -m "Initial commit of 1.x code" 

:

तो यहाँ कैसे मैं मर्क्युरियल में शाखाओं का प्रबंधन करने के ...

एक एकल शाखा के साथ एक भंडार जो मौजूदा रिलीज श्रृंखला 1.x के कोड धारण से शुरू की योजना है (1.x)

$ hg branch 2.x 
$ hg ci -m "Create new branch for 2.x development" 
$ echo "Big new feature for 2.x" > file2.txt 
$ hg ci -A -m "Add big new feature" 

इस बीच, मौजूदा रिलीज श्रृंखला में कुछ काम करना: रिहाई 2.x पर काम शुरू

$ hg up default 
$ echo "Minor adjustments specific for 1.x" > file3.txt 
$ hg ci -A -m "Minor adjustments" 

कुछ समय बाद रिलीज 2.0 तैयार है, yippee! डिफ़ॉल्ट शाखा 1.x करने के लिए डिफ़ॉल्ट करने के लिए और 2.x करें:

$ hg up default 
$ hg branch 1.x 
$ hg ci -m "Make default branch to 1.x branch" 
$ hg up 2.x 
$ hg ci --close-branch -m "Close branch 2.x" 
$ hg branch --force default 
$ hg ci -m "Make former 2.x branch to new default" 

अब एक नई शाखा 3.x और उस में काम बनाने के लिए, यह भी डिफ़ॉल्ट पर काम । फिर, कुछ समय के 3.0 के बाद तैयार है और यह समय फिर से शाखा के नाम का प्रबंधन करने के लिए:

$ hg up default 
$ hg branch --force 2.x # (reuse previously closed 2.x branch name) 
$ hg ci -m "Make default branch to 2.x branch" 
$ hg up 3.x 
$ hg ci --close-branch -m "Close branch 3.x" 
$ hg branch --force default 
$ hg ci -m "Make former 3.x branch to new default" 

अब रेपो कुछ ऐसा दिखाई देगा ('o' सिर कर रहे हैं):

o Branch default (3.x) 
| 
| o Branch 2.x 
\| 
    | o Branch 1.x 
    \| 
    | 
    . 

मुख्य बिंदु मुझे यकीन नहीं है कि शाखा नाम के साथ शाखा नाम और जुगलिंग का उपयोग कर रहा है डिफ़ॉल्ट अच्छा अभ्यास है।

उस प्रश्न के लिए बहुत सारे पाठ - क्षमा करें - लेकिन मैं यह जानना चाहता हूं कि मैं क्या कर रहा हूं।

+0

[Mercurial विकी] (http://www.mercurial-scm.org/wiki/Standardbranching) इस विषय पर एक अच्छा परिचय प्रदान करता है। – xyres

उत्तर

47

यहाँ मैं करना चाहते हैं क्या करना है:

बनाओ default अपने "मुख्य लाइन" शाखा। इस शाखा की नोक "वर्तमान में जनता के लिए जारी की गई" संस्करण है। गंभीर बगफिक्स सीधे इस शाखा में किए जा सकते हैं और विकास शाखाओं में विलय कर सकते हैं।

संस्करण 2.0 पर काम करना शुरू करने के लिए, 2.0-dev शाखा बनाएं। उस शाखा में 2.0 के लिए प्रतिबद्धता बदलें, और इसमें मुख्य बगफिक्स को मुख्यलाइन (default) से मर्ज करें। एक बार जब आप 2.0 के साथ कर लेंगे, तो 2.0-dev को default में विलय करें और परिणाम को 2.0 पर टैग करें।

चीजों को करने का मतलब है कि आपको जॉगलिंग शाखा के नामों के बारे में चिंता करने की ज़रूरत नहीं है, और आप महत्वपूर्ण बगफिक्स को मुख्य रूप से विकास शाखाओं में मुख्य रूप से विलय कर सकते हैं।

यह एक साथ कई भविष्य के संस्करणों पर काम कर रहे हैं (2.1 और 3.0 कहें) यह भी अच्छी तरह से स्केल करता है। 3.0 चालू रखने के लिए आप समय-समय पर 2.1 परिवर्तनों को मर्ज कर सकते हैं।

आप इस प्रकार का ग्राफ के साथ खत्म हो जाएगा:

$ hg glog -l 1000 
@  changeset: 25:efc0096f47c0 tip 
|  summary: Added tag 3.0 for changeset d1a7fc3d7d77 
| 
o  changeset: 24:d1a7fc3d7d77 3.0 
|\  summary: Merge in the redesign changes. 
| | 
| o  changeset: 23:b5b69d24c8f7 3.0-dev 
| |  summary: Finish 3.0 redesign. 
| | 
| o  changeset: 22:4c2f98fac54b 3.0-dev 
|/|  summary: Merge in the latest changes to 2.1/mainline. 
| | 
o |  changeset: 21:37df04521032 
| |  summary: Added tag 2.1 for changeset 39ecc520fc0a 
| | 
o |  changeset: 20:39ecc520fc0a 2.1 
|\ \ summary: 2.1 development is done. 
| | | 
| o | changeset: 19:208f3f9236af 2.1-dev 
| | | summary: Finish the 2.1 work. 
| | | 
| | o changeset: 18:4a024009a9d6 3.0-dev 
| | | summary: More redesign work. 
| | | 
| | o changeset: 17:00c416888c25 3.0-dev 
| |/| summary: Merge in changes from the 2.1 branch to keep the redesign current. 
| | | 
| o | changeset: 16:a57e781a0db1 2.1-dev 
| | | summary: More 2.1 work. 
| | | 
| | o changeset: 15:ddeb65402a61 3.0-dev 
| | | summary: More redesign work. 
| | | 
+---o changeset: 14:90f5d7a8af9a 3.0-dev 
| | | summary: Merge in the fire fixes. 
| | | 
| o | changeset: 13:78a949b67bb9 2.1-dev 
|/| | summary: Merge in the fire fixes. 
| | | 
o | | changeset: 12:6dfe9d856202 
| | | summary: Oh no everything is on fire, fix it in the mainline. 
| | | 
| o | changeset: 11:86767671dcdb 2.1-dev 
| | | summary: Smaller changes for 2.1. 
| | | 
| | o changeset: 10:25dec81d2546 3.0-dev 
| | | summary: Work more on the redesign. 
| | | 
+---o changeset: 9:42c7d689fb24 3.0-dev 
| |  summary: Start working on a complete redesign. 
| | 
| o  changeset: 8:3da99186ca7d 2.1-dev 
|/  summary: Start working on 2.1. 
| 
o  changeset: 7:9ba79361827d 
|  summary: Added tag 2.0 for changeset 755ed5c5e291 
| 
o  changeset: 6:755ed5c5e291 2.0 
|\  summary: Merge in the dev branch for 2.0. 
| | 
| o  changeset: 5:44a833fcc838 2.0-dev 
| |  summary: Finish work on 2.0. 
| | 
| o  changeset: 4:d7ba6aae1651 2.0-dev 
|/|  summary: Merge in the critical fix. 
| | 
o |  changeset: 3:968049f1b33a 
| |  summary: Fix a critical bug on the main branch. 
| | 
| o  changeset: 2:917869609b25 2.0-dev 
| |  summary: More work on the new version. 
| | 
| o  changeset: 1:f95798b9cb2e 2.0-dev 
|/  summary: Start working on version 2.0. 
| 
o  changeset: 0:8a3fb044d3f4 
     summary: Initial commit. 
+2

मैंने इस वर्कफ़्लो के बारे में अनुशंसित एक के रूप में सुना लेकिन मुझे यकीन नहीं था कि अगर मेनलाइन में कई बदलाव हैं जो डेवेल शाखा के लिए समझ में नहीं आते हैं तो यह कितना अच्छा लगता है। मुझे लगता है कि यह नीचे आता है कि मैं डेवेल शाखा में नवीनतम मुख्यलाइन परिवर्तन कैसे विलय करता हूं। मैं मेनलाइन से अवांछित परिवर्तन कैसे संभाल सकता हूं? क्या कुछ ऐसा अभिव्यक्त करना संभव है जैसे "मेनलाइन से चेंज 23 और 27 मर्ज करें लेकिन अन्य सभी परिवर्तनों को अनदेखा करें (या विलय के बाद उन्हें पूर्ववत करें)"? –

+4

यदि आप 23 और 27 मर्ज करना चाहते हैं और दूसरों को अनदेखा करना चाहते हैं, तो आप ट्रांसप्लेंट एक्सटेंशन चाहते हैं: http://mercurial.selenic.com/wiki/TransplantExtension यदि आप सबकुछ मर्ज करना चाहते हैं और 23 और 27 पूर्ववत करना चाहते हैं तो आप सामान्य रूप से विलय करेंगे और फिर 'एचजी बैकआउट 23 --merge; dev शाखा पर रहते हुए एचजी बैकआउट 27 --merge'। –

+2

मुझे लगता है कि 'बैकआउट' कमांड मेरे उद्देश्य के लिए सबसे अच्छा है। मैंने इसका परीक्षण किया है और यह वही करता है जो मैं करना चाहता हूं। ऐसा लगता है कि बैकआउट में केवल कुछ बदलाव हैं। अन्यथा, बहुत सारे अवांछित परिवर्तन होने के कारण, यह इतिहास ग्राफ को फहराएगा और इसका मतलब बहुत सारे मैन्युअल काम होगा .. लेकिन जब तक यह मामला नहीं है तो मैं आपके सुझाव से पूरी तरह से खुश हूं :) धन्यवाद! –

2

मुझे लगता है कि आप इस पर विचार करना चाहिए: a successfull git branching model

मैं गिट का बड़ा प्रशंसक नहीं हूं, लेकिन यह मॉडल भी Mercurial के लिए अतिरिक्त उपयोगी है।