Управление релизными веткими в Mercurial

Недавно я переключился с SVN на Mercurial. Теперь мне интересно, как реализовать мой намеченный поток ветвящихся работ в Mercurial в соответствии с хорошей практикой, надеясь, что другие разработчики поймут, что происходит в репозитории.

Это рабочий поток:

  • Обычно у меня есть ветвь trunk/default, где происходит работа над текущей серией выпусков. Скажем, что это 1.x. В то же время я использую ветку 2.x для работы над следующим основным выпуском. Изменения в этой ветке могут быть радикальными, поэтому слияние с веткой trunk/default/1.x здесь не имеет смысла.
    • Через некоторое время работа над 2.x может быть завершена, и версия 2.0 будет выпущена. Теперь я хочу, чтобы ветка 2.x была новой ветвью по умолчанию/магистрали, а текущая строка по умолчанию /trunk была ветвью 1.x.
    • Повторяя этот процесс, может появиться новая ветка 3.x. Как и прежде, если 3.0 будет выпущен, 3.x должен стать новой ветвью по умолчанию, тогда как текущее значение по умолчанию должно стать ветвью 2.x(снова).

Мой вопрос не в том, хороший ли этот поток работы (я думаю, это не принципиально неправильно). Мои вопросы касаются того, может ли я реализовать это в Mercurial, как хорошую практику или если есть лучшие возможности.

Итак, вот как я планирую управлять ветвями в Mercurial...

Начиная с репозитория с одной ветвью, которая содержит код текущей серии выпусков 1.x:

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

Начните работу над выпуском 2.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"

Между тем, сделайте некоторую работу в текущей серии выпусков (1.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
   \|
    |
    .

Главное, что я не уверен в том, что если повторно использовать имена ветвей и жонглирование с именем ветки по умолчанию - хорошая практика.

Много текста для этого вопроса - извините, но я хотел четко сказать, что я делаю.

Ответ 1

Вот что я сделал бы:

Сделайте default ветку "mainline". Наконечник этой ветки - это версия, выпущенная в настоящее время для публики. Критические исправления могут быть переданы непосредственно этой ветке и объединены в ветвях разработки.

Чтобы начать работу над версией 2.0, создайте ветвь 2.0-dev. Зафиксируйте изменения для 2.0 в этой ветке и слейте в нее критические исправления с основной строки (default). Когда вы закончите с 2.0, объедините 2.0-dev в default и пометьте результат как 2.0.

Ведение дел таким образом означает, что вам не нужно беспокоиться о жонглировании названий ветвей, и вы можете легко слить критические исправления с основной линией в ветвях разработки.

Он также хорошо масштабируется, когда вы одновременно работаете над несколькими будущими версиями (скажем, 2.1 и 3.0). Вы можете периодически объединять изменения 2.1 в 3.0, чтобы сохранить текущее значение 3.0.

В итоге вы получите такой график:

$ 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.