Как правильно закрыть филиал функции в Mercurial?

Я закончил работу с ветвью функций feature-x. Я хочу объединить результаты с веткой default и закрыть feature-x, чтобы избавиться от нее в выводе hg 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 (changests 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 Mercurial больше не отображает заголовки закрытых ветвей на выходе hg heads.

Можно ли закрыть объединенную ветку, не оставив еще одну голову? Есть ли более правильный способ закрыть ветвь функции?

Похожие вопросы:

Ответ 1

Один из способов - просто оставить объединенные ветки функций открытыми (и неактивными):

$ 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, но нужно заранее знать, какая фиксация будет последней.

Обновить. С Mercurial 1.5 вы можете закрыть ветвь в любое время, чтобы она больше не отображалась как в hg branches, так и в hg heads. Единственное, что может вас раздражать, это то, что технически граф пересмотра будет по-прежнему иметь еще одну ревизию без посторонних.

Обновление 2. Так как закладки Mercurial 1.8 стали основной особенностью Mercurial. Закладки более удобны для ветвления, чем названные ветки. См. Также этот вопрос:

Ответ 2

imho есть два случая для ветвей, которые были забыты закрыть

Случай 1:  ветвь не была объединена по умолчанию

в этом случае я обновляюсь до ветки и делаю еще одну фиксацию с -close-branch, к сожалению, это выбирает ветку, чтобы стать новой подсказкой, и, следовательно, прежде чем нажимать ее на другие клоны, я убеждаюсь, что реальный наконечник получает еще немного изменения и другие не путаются с этим странным советом.

hg up myBranch
hg commit --close-branch

Случай 2:  ветвь была объединена по умолчанию

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

в этом случае я обновляюсь до набора изменений ветвей, делаю еще одно коммит с -close-branch и объединяю новый набор изменений, который стал подсказкой по умолчанию. последняя операция создает новый наконечник, который находится в ветке по умолчанию - HOORAY!

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

Надеюсь, это поможет будущим читателям.

Ответ 3

ИЗМЕНИТЬ ouch, слишком поздно... Я знаю, что прочитал ваш комментарий о том, что вы хотите сохранить набор изменений функции-x, поэтому подход клонирования здесь не работает.

Я все равно дам ответ здесь, это может помочь другим.

Если вы хотите полностью избавиться от "функции X", потому что, например, это не сработало, вы можете клонировать. Это один из методов, описанных в статье, и он действительно работает, и он конкретно рассказывает о головах.

Насколько я понимаю, у вас есть это и вы хотите избавиться от головы "feature-x" раз и навсегда:

@    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

И у вас будет следующее, и вы увидите, что функция-x действительно отсутствует:

@    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

Возможно, я неправильно понял, что вы хотели, но, пожалуйста, не модерируйте, я потратил время на воспроизведение вашего прецедента:)

Ответ 4

Странно, что никто еще не предложил самый надежный способ закрытия ветвей функций... Вы можете просто объединить фиксацию слияния с флагом -close-branch (т.е. Скопировать измененные файлы и закрыть ветвь одновременно):

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

Итак, вот и все. Никакой дополнительной головы на регграфе. Никакой дополнительной фиксации.