Mercurial перемещает изменения в новую ветку

124

У меня есть ряд изменений, которые я внес в свой локальный репозиторий, но еще не внесен. Поскольку функция занимает больше времени, чем ожидалось, я хочу поменять эти изменения на именованную ветку, прежде чем нажимать. Как я могу это сделать?

Casebash
источник

Ответы:

153

Как предложил Марк, MqExtension - одно из решений вашей проблемы. IMHO, более простой рабочий процесс - использовать расширение rebase . Предположим, у вас есть такая история:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Это означает, что ревизия 0- это основа, на которой вы начали работу над своей функцией. Теперь 1-2, скажем, вы хотите иметь исправления в именованной ветке my-feature. Обновите до ревизии 0и создайте эту ветку:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

История теперь выглядит так:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Используйте rebaseкоманду, чтобы переместить ревизию 1-2в ревизию 3:

$ hg rebase -s 1 -d 3

Это приводит к следующему графику:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

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

Обен Сонне
источник
4
ИМХО, недостатком этого решения является то, что оно вводит фиктивную фиксацию «start new branch my-feature» (т.е. тот, который не изменяет никакие файлы).
sschuberth
9
@sschuberth: Я думаю, что откровенность - это хорошо. Если дополнительный набор изменений является для вас проблемой, объедините его с последующим (например, с помощью foldкоманды теперь встроенного расширения histedit ).
Обен Сонне
6
@AmirRachum: hg log -G( GraphlogExtension ). Я вырезал некоторые строки вручную, но их также можно было отобразить полностью автоматически с использованием пользовательских стилей журнала .
Обен Сонне
2
Включить расширение перебазирования : mercurial.selenic.com/wiki/RebaseExtension#Configuration
56ka 08
1
@sschuberth Согласен. Мой обходной путь - перебазировать ваши не-фиктивные коммиты на родительский фиктивный коммит с флагом --keepbranches, а затем hg удалить фиктивную фиксацию. Это большая работа по изменению имени ветки, но иногда Mercurial так глуп.
weberc2 05
30

Вы можете использовать MqExtension . Скажем, наборы изменений, которые нужно переместить, - это ревизии 1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches
Марк Толонен
источник
Я хочу импортировать 63:64 и 66:68. Я получаю, что ревизия 65 не является родительской для 64
Casebash
Что ты хочешь делать с 65? Mq может преобразовывать только последовательные ревизии из головы. Он превращает обычно неизменные наборы изменений в изменяемые патчи, которые можно редактировать. Это изменяет хэши (затрагивает всех дочерних элементов), поэтому вы не можете пропустить.
Марк Толонен
У меня есть ряд изменений (включая 65), которые я внес в основную ветку и подтолкнул
Casebash
1
Не редактируйте отправленные ревизии. Mq изменяет хэши, так что они будут фактически новыми наборами изменений. Редактируйте только ту историю, которая не была отправлена.
Марк Толонен
Если вы уже выставили 65, то вам определенно не следует двигаться 63 и 64, а просто довольствоваться ходом 66:68 (опять же, только если вы их не толкали).
Мэтт
9

Я предпочитаю описанное здесь патч-решение Марком Толоненом

Что у меня есть:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

Что я хочу:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

Команды mercurials:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

Вот состояние моего локального репозитория

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

Теперь мне нужно удалить ревизии 1, 2 и 3 из моей ветки по умолчанию. Вы можете сделать это с помощью команды strip из расширения mq. hg stripудаляет набор изменений и всех его потомков из репозитория.

Включите расширение, добавив следующие строки в ваш файл конфигурации (.hgrc или Mercurial.ini):

vim ~/.hgrc и добавить :

[extensions]
mq =

А теперь удалите этот репозиторий на ревизию 1.

hg strip 1

и вот мы

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

примечание: ревизии разные, но ревизии такие же

Гийом Винсент
источник
5

Для тех, кто склонен использовать графический интерфейс

  1. Перейдите к Tortoise Hg-> File-> Settingsзатем отметьте rebase.

введите описание изображения здесь

  1. Перезапустить интерфейс черепахи

  2. Создайте новую ветку, в которую вы будете переносить изменения. Щелкните имя текущей ветки -> выберите Open a new named branch-> выберите имя ветки.

введите описание изображения здесь

  1. Если изменения, которые вы хотите перенести, не были внесены public(например draft), перейдите к 5. (Если изменения уже были опубликованы, и вы не являетесь старшим разработчиком, вам следует поговорить с кем-то старшим (получить козла отпущения), так как вы можете сильно облажаться. , Ответственности не беру :)).

Перейдите к View-> Show Console(или Ctrl+ L), затем напишите в консоли hg phase -f -d 2- где 2 - самая низкая ревизия, вы перейдете в новую ветку.

  1. Перейти к ветке и ревизии (должна быть самая верхняя ревизия, если вы перемещаете изменения в новую ветку, созданную на шаге 3) Right Mouse->Update

  2. Перейдите в ветку и версию, из которой вы будете перемещать изменения Right Mouse-> Modify History->Rebase

введите описание изображения здесь

  1. Щелкай Rebaseи молись, чтобы не было конфликтов, сливайся, если нужно.

  2. Нажимайте изменения, на этом этапе все исправления должны быть draft.

  3. Перейдите к самой верхней ревизии в ветке, в которую вы перемещали изменения Right Mouse-> Change Phase to-> Public.

введите описание изображения здесь

Надеюсь, это сэкономит вам время.

Матас Вайткявичюс
источник
Прекрасная работа! собираюсь попробовать это, только один вопрос - зачем менять фазу на публикацию в конце? «Любые наборы изменений, которые можно увидеть в удаленном репозитории, являются общедоступными», поэтому, когда вы нажимаете, не будет ли он все равно открыт для всех?
Джошуа Даксбери
@JoshLeeDucks При нажатии они больше не меняются publicавтоматически (по крайней мере, для меня они не меняются ).
Matas Vaitkevicius