У меня есть ряд изменений, которые я внес в свой локальный репозиторий, но еще не внесен. Поскольку функция занимает больше времени, чем ожидалось, я хочу поменять эти изменения на именованную ветку, прежде чем нажимать. Как я могу это сделать?
У меня есть ряд изменений, которые я внес в свой локальный репозиторий, но еще не внесен. Поскольку функция занимает больше времени, чем ожидалось, я хочу поменять эти изменения на именованную ветку, прежде чем нажимать. Как я могу это сделать?
Ответы:
Как предложил Марк, 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
Вот и все ... как упоминалось в комментариях к ответу Марка, перемещение уже выдвинутых наборов изменений обычно является плохой идеей, если вы не работаете в небольшой команде, где вы можете общаться и обеспечивать выполнение своих манипуляций с историей.
fold
команды теперь встроенного расширения histedit ).
hg log -G
( GraphlogExtension ). Я вырезал некоторые строки вручную, но их также можно было отобразить полностью автоматически с использованием пользовательских стилей журнала .
Вы можете использовать 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
Я предпочитаю описанное здесь патч-решение Марком Толоненом
Что у меня есть:
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
примечание: ревизии разные, но ревизии такие же
Для тех, кто склонен использовать графический интерфейс
Tortoise Hg
-> File
-> Settings
затем отметьте rebase
.Перезапустить интерфейс черепахи
Создайте новую ветку, в которую вы будете переносить изменения. Щелкните имя текущей ветки -> выберите Open a new named branch
-> выберите имя ветки.
public
(например draft
), перейдите к 5. (Если изменения уже были опубликованы, и вы не являетесь старшим разработчиком, вам следует поговорить с кем-то старшим (получить козла отпущения), так как вы можете сильно облажаться. , Ответственности не беру :)).Перейдите к View
-> Show Console
(или Ctrl+ L), затем напишите в консоли hg phase -f -d 2
- где 2 - самая низкая ревизия, вы перейдете в новую ветку.
Перейти к ветке и ревизии (должна быть самая верхняя ревизия, если вы перемещаете изменения в новую ветку, созданную на шаге 3) Right Mouse
->Update
Перейдите в ветку и версию, из которой вы будете перемещать изменения Right Mouse
-> Modify History
->Rebase
Щелкай Rebase
и молись, чтобы не было конфликтов, сливайся, если нужно.
Нажимайте изменения, на этом этапе все исправления должны быть draft
.
Перейдите к самой верхней ревизии в ветке, в которую вы перемещали изменения Right Mouse
-> Change Phase to
-> Public
.
Надеюсь, это сэкономит вам время.
public
автоматически (по крайней мере, для меня они не меняются ).