Как удалить набор изменений из репозитория hg без потери принятых изменений после этого
Мне нужно удалить набор изменений, скажем, 123b, который находится где-то посередине нескольких наборов изменений в ветви. Я совершил много изменений после 123b. Как удалить набор изменений 123b без потери последних изменений
2 ответа
Скажем, у вас есть наборы изменений:
A-B-C-D-....
(Где ваш 123b может быть представлен, скажем, B здесь).
Если B, C и ни один из их потомков еще не были вытеснены (поэтому они существуют только в вашем локальном хранилище), то вы можете сначала перебазировать C в A, а затем удалить B.
Технически вы не можете: набор изменений включает в себя всю родительскую историю, поэтому, удалив 123b
Уничтожь всех ее потомков. Любые непосредственные дети теперь повреждены, поскольку они относятся к несуществующим 123b
и любые дети из этих детей получают косвенные повреждения и так далее.
Тем не менее, есть и яркая сторона. Вы можете заменить всех потомков новыми, улучшенными потомками. Для этого используйте hg histedit
, Это связанное расширение, которое вы должны сначала включить. (См., Например, Каковы лучшие и обязательные расширения hg / mercurial?) (В качестве альтернативы, можно использовать rebase или прививку, но я не рекомендую - histedit проще).
Обратите внимание, что histedit по существу эквивалентен удалению набора изменений и всех его потомков, а затем добавлению новых наборов изменений. Таким образом, если вы сделали набор изменений общедоступным, отправив его другому клону, он позже вернется к этому другому клону вместе со всеми его потомками. По умолчанию histedit не позволяет вам редактировать общедоступные наборы изменений, чтобы вы не допустили эту ошибку. Смотрите также https://book.mercurial-scm.org/read/changing-history.html.
(Существует лучший (на мой взгляд) способ, но он включает добавление не связанного расширения, в частности расширения evolve. См. Этот ответ на связанный вопрос. На самом деле я не использовал evolve, мне просто нравится теория, лежащая в его основе.)