Подтвердить что ты не робот

Отменить hg push (backout?)

Я сделал большой урон и мог использовать некоторую помощь, чтобы отменить его.

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

Стабильный репозиторий теперь выглядит следующим образом:

*merge
| \
|  \
|   *b
*a  |
|  / 
*c

где a - это фиксация, которая должна быть концом стабильного репозитория, b - это все, что мы сделали в репозитории разработки, а c - это точка, в которой мы разветвляли репозиторий разработки.

Как мне вернуться к:

*a
|
*c

(Я знаю, что я не могу сделать изменения, я просто ищу функциональную структуру...)

Я прочитал некоторые вещи, которые заставляют меня думать, что hg backout - это необходимая мне команда, но я не совсем уверен, что она делает.

4b9b3361

Ответ 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