Mercurial: можно переименовать ветку?


205

Теперь у нас есть ветвь «заострения», где «постановка», кажется, намного лучше семантической подгонки. Какова хорошая стратегия для решения этой проблемы?

Ответы:


224

Обновите stigingветку и создайте из нее новую ветку. Затем закройте старую ветку.

В итоге:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

1
Это лучший способ сделать это, что я нашел. Закрытие ветки предотвращает случайное использование ее другими, потому что она не отображается в выводе «hg ветки». Это все еще позволяет вам получить к нему доступ позже, если вы знаете имя.
Посуда

2
Позволит ли Mercurial повторно использовать имя закрытой ветки? То есть, если у вас есть ветка v3, можете ли вы использовать вышеописанную технику, чтобы переименовать ее в v4, а затем разветвить новую ветку v3, несмотря на то, что вы оставили закрытую v3?
Джошуа Голдберг

4
@JoshuaGoldberg, 3ноча не так. Mercurial будет позволяет повторно использовать имя закрытой ветки, если вы используете --force. Например: hg branch --force v3. Это приведет к hg update v3обновлению на новую v3ветку, как вы хотели.
Гили

2
@ Gili подтвердил комментарий с помощью hg help branch: "--force установить имя ветки, даже если оно затеняет существующую ветку"
Джошуа Голдберг

7
Если вы закроете stigingперед ветвлением, вы не получите «свободный конец»
max.mustermann

60

Для будущих читателей: с rebaseрасширением вы можете создать новую ветку с тем же родительским элементом stigingи переместить в нее всю историю веток, например:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

Это предполагает, что stigingимеет только одного родителя. Конечно, вы можете просто использовать явные номера ревизий.

Примечание 1: Если ветвь stigingвключает слияния с другими ветвями, я думаю, что это сохранит их до тех пор, пока у них будет один stagingи stigingтот же родительский элемент. Но я бы точно перепроверил.

Примечание 2: Так как это редактирует историю, старая ветвь не просто исчезнет из клонированных репозиториев (см. rebaseДокументацию). Если каждый не может клонировать заново, это может быть не очень практичным решением для большой группы.

Примечание 3 / Правка (любезно предоставлено @JasonRCoombs): теперь, когда фазы являются стандартными в Mercurial, rebaseон откажется изменять изменения, которые уже были переданы. Либо дурачите его, изменяя фазу обратно на черновик (с помощью hg phases), либо оставьте старую ветвь на месте, и просто сделайте копию с правильным именем (например, с помощью `hg rebase --keep ').


+1 для небольших команд, где вы можете заставить пользователей клонировать это хорошая идея - или использовать hg convertвместо этого.
hochl

5
В более поздних версиях Mercurial команда rebase завершится с ошибкой «не может перебазировать неизменяемый набор изменений», если изменения, подлежащие перемещению, являются «общедоступными». Либо заставьте их быть черновиками (с фазами hg), либо передайте --keepкоманду rebase, которая скопирует, а не переместит изменения.
Джейсон Р. Кумбс

На этапе 4: abort: can't rebase immutable changeset 11b1e2b7dc4f. Обратите внимание, что я привил наборы изменений из другой ветви в эту. Кроме того, он разделен и объединен бесплатно.
Марк Иеронимус

@ Марк, взгляните на Примечание 3 выше.
Алексис

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

16

Если у вас есть наборы изменений, то вам придется использовать расширение convert с картой ветвления, чтобы переименовать его. Тогда каждому придется клонировать новый репо или убрать старую ветку.


1
Это интересное решение, можете ли вы уточнить немного?
DrM

15

Сделайте новую ветку под названием «постановка» и забудьте о другой ...


+1 это то, что я бы сделал. У старых наборов изменений все еще будет старое имя ветви, но у новых будет новое имя ветви.
Барджак

6

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

Если стимуляция только локальная, вы можете изменить ее на постановку с помощью комбинации трансплантата и полоски . Начните с обновления до набора изменений предка, где отклонения отстоят. Создайте промежуточную ветвь и пересаживайте каждый коммит, начиная от заклинания до постановки Постановка теперь должна быть копией стигинга. И наконец, уничтожьте удар, сняв первый коммит.

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch

1
Для шага 3 вы можете использоватьhg graft {first changeset in stiging}..{stiging head}
KCD
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.