Вопрос

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

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

Связанные вопросы:

Это было полезно?

Решение

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

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

Другие советы

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

Дело 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

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

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

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

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

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

Ну вот и все.Ни одной лишней головы на ревграфе.Никаких дополнительных коммитов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top