У меня есть ряд изменений, которые я совершил в своем локальном репозитории, но еще не нажал. Поскольку в функции больше времени, чем ожидалось, я хочу поменять эти изменения на именованную ветвь, прежде чем нажимать. Как я могу это сделать?
Меркуриальный переход меняется на новую ветку
Ответ 1
Как предложил Марк, MqExtension - это одно из решений для вас. ИМХО - более простой рабочий процесс - использовать расширение переадресации. Предположим, что у вас есть такая история:
@ 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
То, что это... как упоминалось в комментариях к ответу Марка, перемещение уже нажатых наборов изменений - это плохая идея, если вы не работаете в небольшой команде, где вы можете общаться и применять свои манипуляции с историей.
Ответ 2
Вы можете использовать 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
Ответ 3
Я предпочитаю, чтобы патч-решение описывал здесь Марк Толонен
Что у меня:
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
note: изменения в настройках разные, но изменения одинаковы
Ответ 4
Для пользователей, склонных к использованию графического интерфейса пользователя
- Перейдите к
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
.
Надеюсь, это сэкономит вам некоторое время.