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 были похожи (то есть: касание одинаковых строк в файле, переименование файлов и т. Д.), То вы можете получить некоторые отклоненные файлы.