Отменить hg push (отступить?) - PullRequest
       27

Отменить hg push (отступить?)

39 голосов
/ 22 сентября 2010

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

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

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

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

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

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

*a
|
*c

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

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

Ответы [ 4 ]

48 голосов
/ 22 сентября 2010

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

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


ОБНОВЛЕНИЕ (согласно комментарию @ Руди: извините, я пропустил "уже выдвинутую" часть)

Поскольку слияниеуже вытолкнул, НИКОГДА НЕ делай то, что я предлагал ранее.Ненависть к электронным письмам от других разработчиков была бы лучшим результатом.

Сделайте это вместо этого:

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 голосов
/ 22 сентября 2010

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

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

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

Я предлагаю hg update -C пересмотреть *, объединить с подсказкой и проигнорировать все изменения с * объединить?Ваш репозиторий будет выглядеть примерно так:

*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

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

0 голосов
/ 19 мая 2014

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

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

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

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

0 голосов
/ 22 сентября 2010

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

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

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

откат hg даст:

*a  *b
|  / 
*c

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

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

...