Hg Named Branch Errant Commit Cleanup

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

A - B - C
 \
  W - X - D - E - Y - Z

В котором ABCDE (как предполагается) является частью главной ветви, а WXYZ - коммиты в новой именованной ветви. Разработчик не смог обновить до "C", прежде чем вносить свои изменения "D" и "E", а затем зафиксировал "Y" и "Z" поверх них.

Мне нужно переместить 'D' и 'E' в основную ветвь, не включая WXYZ.

A - B - C - D - E
 \
  W - X - Y - Z

Я не очень разбираюсь в Hg в целом, но я учусь и готов. Я посмотрел на ребаз, и это, кажется, не привело меня туда, куда мне нужно идти. Я мог бы заставить разработчика отменить свои изменения и повторно применить их в нужном месте, но это не совсем верно.

Как бы вы решили решить эту проблему?

Спасибо!

2 ответа

Решение

Вероятно, самым безопасным способом было бы скопировать ревизии из одной ветви в другую, а затем вывести их обратно из ветви, для которой они были зафиксированы, используя следующие команды (замените буквы номерами ревизий для этих наборов изменений):

> hg up C
> hg graft D:E
> hg up Z
> hg backout D:E
> hg commit -m "Backout changes D to E"

Это оставляет ветку по умолчанию, как это должно быть, но оставляет несколько неправильных ревизий в именованной ветке, которые были отменены в одном коммите.

Если вы хотите редактировать историю с hg rebase тогда вы можете сделать это с помощью следующих команд:

> hg rebase -r Y:Z -d X
> hg rebase -r D:E -d C -D

Вам, вероятно, потребуется изменить фазы наборов изменений, чтобы они были черновыми, прежде чем делать это (hg phase -d rev делает это)

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

В дополнение к отличной идее поддержки, опубликованной Стивом Кейем, я бы порекомендовал поэкспериментировать с очередями исправлений с использованием расширения Mercurial Queues. Если вы импортируете D, E, Y и Z в очередь исправлений, вы можете применить исправления D и E поверх B, а затем применить Y и Z поверх X.

Если изменения в ветке ABCD были отделены от WXYZ, то это должно произойти без каких-либо проблем. Однако, если изменения ABCD и WXYZ были похожи (то есть: касание одинаковых строк в файле, переименование файлов и т. Д.), То вы можете получить некоторые отклоненные файлы.

Другие вопросы по тегам