Отменить hg push (backout?)
Я сделал большой урон и мог использовать некоторую помощь, чтобы отменить его.
У нас есть два репозитория - довольно стабильный репозиторий и репозиторий, над которым мы работаем над изменениями. Я только что исправил ошибку в нашем стабильном репозитории и переместил его в рабочий репозиторий. Я вытащил из стабильного репозитория, объединил его, а затем случайно нажал на стабильный репозиторий.
Стабильный репозиторий теперь выглядит следующим образом:
*merge
| \
| \
| *b
*a |
| /
*c
где a - это фиксация, которая должна быть концом стабильного репозитория, b - это все, что мы сделали в репозитории разработки, а c - это точка, в которой мы разветвляли репозиторий разработки.
Как мне вернуться к:
*a
|
*c
(Я знаю, что я не могу сделать изменения, я просто ищу функциональную структуру...)
Я прочитал некоторые вещи, которые заставляют меня думать, что hg backout - это необходимая мне команда, но я не совсем уверен, что она делает.
Ответы
Ответ 1
hg rollback
возвращает последнюю транзакцию, поэтому у вас останется незавершенное слияние, которое вы должны использовать hg update -C
, чтобы выйти.
Если вы не хотите * b (у вас есть это в другом клоне), включите встроенное расширение MQ и запустите hg strip -r <*b>
. Он избавится от * b и * слияния. По умолчанию он сохраняет резервную копию, если вы снова передумаете.
ОБНОВЛЕНИЕ (за комментарий @Rudi: извините, я пропустил часть "уже нажал" )
Поскольку слияние уже вытолкнуто, НИКОГДА НИКОГДА делать то, что я предложил ранее. Ненависть электронной почты от других разработчиков была бы лучшим результатом.
Сделайте это вместо:
hg up -r<*merge>
hg revert -r<*a> -a
hg ci -m "undo unintended merge"
Или вы можете быть более кошерным:
hg up -r<*merge>
hg backout -r<*merge> --parent<*a>
Ответ 2
Я думаю, что до конца сделать hg rollback
, так как вы уже нажали свои изменения.
Вы можете попробовать с расширениями MQ, но это также работает локально. hg strip
изменяет только локальное репо. Разумеется, вы могли бы попробовать изменить серверное репо прямо на сервере, но если кто-то его потянул, то уже слишком поздно.
Другая опция описана в глава 9 hgbook в разделе Резервное копирование слияния. Он включает в себя команду hg backout
, но это может быть излишним для вас...
Я предлагаю hg update -C
to * ревизию, сливаться с подсказкой и игнорировать все изменения из * merge? Ваш репозиторий будет выглядеть примерно так:
*second merge
| \
| \
| \
| \
*merge |
| \ |
| \ |
| *b |
*a | /
| / /
*c---
Команды для этого
-
$ hg --config ui.merge=internal:local merge #keep my files
-
$ hg --config ui.merge=internal:other merge #keep their files
Более подробную информацию можно найти здесь
Ответ 3
hg rollback
вернет последнюю фиксацию, удалив любую историю, которая в противном случае была бы сделана.
Итак, если вы начинаете с этого:
*merge
| \
| \
| *b
*a |
| /
*c
Откат hg даст:
*a *b
| /
*c
обратите внимание, что вы можете сделать только hg rollback
только один раз.
Перед выполнением отката вы должны сделать полную резервную копию хранилища. Для этого просто hg clone
весь репозиторий.
Ответ 4
Вы все представляете мало сложное решение этой проблемы, которое может произойти для любого из нас.
Что я сделал, я зашел на удаленный рабочий стол в мой центральный репозиторий и там с расширением mq
изменил статус ревизии на "черновик" и "оговорил" их.
Единственный недостаток этого заключается в том, что если у кого-то есть копия репо с раздробленными ревизиями и будет толкаться, они снова появятся. Поэтому, если вы можете, попросите других
а) делать то же самое (черновик, полоса)
b) удалить их локальный репозиторий и выполнить повторную синхронизацию с измененным
Все можно легко достичь с помощью TortoiseHg