Mercurial переместится в новую ветку - PullRequest
121 голосов
/ 12 января 2011

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

Ответы [ 4 ]

150 голосов
/ 12 января 2011

Как подсказывает Марк, MqExtension - это одно решение вашей проблемы. ИМХО, более простой рабочий процесс - использовать расширение 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

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

30 голосов
/ 12 января 2011

Вы можете использовать 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
9 голосов
/ 25 июля 2013

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

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

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 голосов
/ 28 июня 2016

Для тех, кто склонен использовать GUI

  1. Перейти к Tortoise Hg -> File -> Settings, затем поставить галочку rebase.

enter image description here

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

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

enter image description here

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

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

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

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

enter image description here

Нажмите Rebase и молитесь, чтобы не было конфликтов, объедините, если необходимо.

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

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

enter image description here

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

...