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


124

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


Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.