Как правильно закрыть ветку объектов в Mercurial? - PullRequest
237 голосов
/ 10 февраля 2010

Я закончил работу над веткой функций 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 (изменения 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.

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

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

Ответы [ 4 ]

216 голосов
/ 10 февраля 2010

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

$ 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. Закладки более удобны для ветвления, чем именованные. Смотрите также этот вопрос:

79 голосов
/ 28 января 2011

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

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

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

hg up myBranch
hg commit --close-branch

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

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

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

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

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

11 голосов
/ 10 февраля 2010

РЕДАКТИРОВАТЬ ой, слишком поздно ... Я знаю, что прочитал ваш комментарий о том, что вы хотите сохранить набор изменений функции-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

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

7 голосов
/ 07 марта 2015

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

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

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

...