Отмена изменений без удаления из истории

Есть коммит, который просто не работает, поэтому я хочу отказаться от него, не удаляя его из истории.

Я обновился с более ранней редакции и зафиксировал, создав тем самым новую голову.


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

Кажется, я не могу найти, как это сделать, и начинаю верить, что это невозможно. Все, что я нахожу, это что-то о ветвях или о слиянии

Ответ 1

Обновите свой репозиторий до заголовка с ревизией, о которой вы хотите забыть, затем используйте hg commit --close-branch, чтобы пометить эту (анонимную) ветвь как закрытую. Затем обновите заголовок нужной ветки и продолжайте работу.

Вы по-прежнему можете видеть закрытую ветвь, если вы используете опцию -c для hg heads, но она не будет отображаться по умолчанию, и hg merge будет знать, что не пытается объединиться с закрытой головкой.

Вам нужно будет использовать hg push --force при первой установке этой закрытой головки в другой репозиторий, поскольку вы фактически создаете дополнительные головки в удаленном репозитории при нажатии. Так что скажите Mercurial, что это нормально с --force. Людей, которые тянут закрытую голову, не будут беспокоить никакие предупреждения.

Ответ 2

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


Нет проблем с тем, чтобы вести себя так же, как вы, и не беспокоиться о наличии нескольких головок, но если вы хотите привести в порядок вещи, чтобы случайно не выбрать неправильную головку, вы можете убить старую ветку.

В документации Mercurial есть хороший раздел, в котором рассказывается о различных возможностях, связанных с обрезкой мертвых веток.

Я думаю, что лучший вариант для вас - пометить старую ветку как "закрытую". Если ваша старая голова - ревизия "123", тогда:

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default

Ответ 3

Прежде всего, введите:

hg heads

Представьте, у вас есть три главы:

changeset:   223:d1c3deae6297
user:        Your name  <[email protected]>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <[email protected]>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <[email protected]>
date:        Sat Sep 14 13:14:40 2013 +0200
summary:     commit description #1

Скажем, вы хотите сохранить последнюю головку активной (223) и закрыть остальные.

Затем вы будете делать следующее:

Закрыть головку № 59

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

Закрыть головку № 123

hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"

Зафиксировать изменения

hg push

Не забудьте переключиться на правую головку в конце

hg up -r 223

И все готово.

Ответ 4

Вы хотите использовать hg backout. Это удаляет изменения, внесенные с помощью набора изменений из любого детского набора изменений.

Проверьте это, чтобы получить хорошее объяснение. Mercurial Backout

Ответ 5

И ответы Нила и Ника прямолинейны. Поскольку я нахожу, что создаю много болтающихся голов, я закончил писать псевдоним, чтобы легче закрыть головы. Добавив это к вашему .hgrc:

[alias]
behead = !REV=$($HG id -i); $HG update [email protected] -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q

(если у вас уже есть раздел [alias], вы можете добавить его к нему)

Теперь вы можете закрыть голову одной командой (и без необходимости вручную обновлять ее вручную):

$ hg behead 123

Примечание: псевдоним использует тот факт, что Mercurial aliases могут быть командами оболочки. Это означает, что это, вероятно, будет работать только в UNIX, а не в Windows.

Ответ 6

Это пример использования расширения Evolve. В настоящее время он не входит в комплект Mercurial, поэтому технически он является сторонним расширением. Но он довольно активно используется группой людей, включая разработчиков Mercurial, очень активно разрабатывается и никуда не денется.

С расширением Evolve вы просто делаете

hg prune -r revname

и продолжить свою жизнь. Cset все еще будет там, но устарел. Он не будет виден, если вы не --hidden опцию --hidden командам Mercurial, и по умолчанию не будет передан в удаленные репозитории. Хотя я думаю, что вы можете заставить его, если вы действительно этого хотите.

Если у сокращаемого набора есть предки, которых вы хотите сохранить, то вам придется запустить hg evolve чтобы перебазировать эти наборы изменений. hg evolve сделает это автоматически. В противном случае вам не нужно ничего делать.

Ответ 7

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

hg clone --rev myGoodResition myDirtyRepo myCleanRepo

Ответ 8

Альтернативой закрытию или удалению нежелательной ветки было бы объединить ее таким образом, чтобы полностью исключить ее последствия, но оставить ее в истории. Этот подход позволит распространять эти нежелательные изменения одним нажатием - поэтому используйте его, только если это является желаемым эффектом.

Допустим, история изменений выглядит так:

1-2-3-4-5-6    
       \    
        7-8-*

и это 5 и 6 которые больше не нужны.

Вы можете сделать это:

hg up 8
hg merge -r 6 -t :local
hg commit ...

который создаст это:

1-2-3-4-5-6    
       \   \
        7-8-9-*

Обновление до 8 гарантирует, что вы работаете с желаемой головой в истории, которую вы хотите сохранить.

-t :local инструктирует hg использовать "инструмент" слияния, называемый local, который говорит ему игнорировать изменения из другой ветки, то есть той, которая НЕ представлена текущим состоянием рабочей папки. Больше информации

Таким образом, нежелательные изменения в 5 и 6 сохранились в истории, но не влияют ни на что более недавнее.

Ответ 9

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

В вашей локальной копии получите последнюю информацию, а затем:

  • Найдите начало головы, которую хотите разбить (где новая шея начинает отходить), получите номер версии

  • Разделите его.


Источник: TipsAndTricks.

Источник: PruningDeadBranches#Using_strip.

hg --config extensions.hgext.mq= strip -n <rev>
  1. Сделайте тривиальное обновление файла (добавьте пробел в файл), зафиксируйте и нажмите.

У вашего репо теперь должна быть голова. Последний шаг важен, поскольку удаление не создает никаких изменений, которые вы можете нажать на центральный репозиторий. Без последнего шага вы только лишили голову локально.