Отменить нажатие hg (откат?)

Я сделал большой упс, и мне не помешала бы помощь, чтобы отменить это.

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

Теперь стабильный репозиторий выглядит так:

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

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

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

*a
|
*c

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

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


person Neil    schedule 21.09.2010    source источник


Ответы (4)


hg rollback отменяет последнюю транзакцию, поэтому у вас останется незавершенное слияние, которое вы должны использовать hg update -C для выхода.

Если вам не нужен *b (он у вас есть в другом клоне), то включите встроенное расширение MQ и запустите hg strip -r <*b>. Он избавится от *b и *merge. По умолчанию он сохраняет резервную копию на случай, если вы снова передумаете.


ОБНОВЛЕНИЕ (за комментарий @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>
person Geoffrey Zheng    schedule 22.09.2010
comment
Поскольку слияние уже отправлено, фиксация слияния не может быть отменена (push и pull также являются транзакциями). Также эту операцию необходимо будет проделать в каждой рабочей копии, которая вытащила этот коммит из стабильного репозитория. - person Rudi; 22.09.2010
comment
В чем разница между использованием возврата и возврата? В итоге я использовал откат, но я хотел бы знать свои варианты (хотя я надеюсь, что это никогда не повторится!) - person Neil; 22.09.2010
comment
backout фиксирует новый набор изменений поверх существующих наборов изменений, чтобы эффективно отменить изменения. revert изменяет вашу рабочую копию и не фиксируется. - person Geoffrey Zheng; 22.09.2010
comment
FYI hg backout --parent теперь устарел (часть --parent) - person Lambart; 08.08.2013

Я думаю, что слишком поздно делать hg rollback, так как вы уже внесли свои изменения.

Вы можете попробовать использовать расширения MQ, но это также работает локально. hg strip изменит только ваше локальное репо. Конечно, вы можете попытаться изменить репозиторий вашего сервера прямо на сервере, но если кто-то вытащит его, будет слишком поздно.

Другой вариант описан в главе 9 документа hgbook в разделе Отмена слияния. Это включает в себя команду hg backout, но это может быть излишним для вас...

Предлагаю hg update -C сделать *ревизию, объединить с подсказкой и игнорировать все изменения от *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

Более подробную информацию можно найти здесь.

person Michal Sznajder    schedule 22.09.2010

hg rollback вернет последнюю фиксацию, удалив всю историю, которая в противном случае была бы сделана.

Итак, если начать с этого:

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

hg откат даст:

*a  *b
|  / 
*c

обратите внимание, что вы можете сделать hg rollback только один раз.

Вы должны сделать полную резервную копию репозитория перед выполнением отката. Для этого просто hg clone весь репозиторий.

person Lie Ryan    schedule 21.09.2010
comment
Я думаю, вы имеете в виду откат, а не откат. :) - person Niall C.; 22.09.2010

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

Что я сделал, я вошел на удаленный рабочий стол в свой центральный репозиторий, и там с расширением mq изменил статус версии на «черновик» и «оформил» их.

Единственным недостатком этого является то, что если у кого-то есть копия репо с удаленными ревизиями и он нажмет, они появятся снова. Поэтому, если вы можете, попросите других а) сделать то же самое (черновик, полоса) б) удалить их локальный репозиторий и выполнить повторную синхронизацию с измененным

Всего этого можно легко достичь с помощью TortoiseHg.

person Szymon Toda    schedule 19.05.2014