Отмена изменений без удаления из истории - PullRequest
176 голосов
/ 11 сентября 2010

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

Я обновил предыдущую ревизию и зафиксировал, создавновая голова.


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

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

Ответы [ 9 ]

178 голосов
/ 11 сентября 2010

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

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

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

67 голосов
/ 12 сентября 2010

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

В документации Mercurial есть хороший разделЭто позволяет вам выбрать несколько вариантов: Обрезка мертвых веток .

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

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default
20 голосов
/ 10 июня 2014

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

hg heads

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

changeset:   223:d1c3deae6297
user:        Your name  <your@email.com>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <your@email.com>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <your@email.com>
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

И все готово.

12 голосов
/ 11 сентября 2010

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

Проверьте это для хорошего объяснения. Mercurial Backout

2 голосов
/ 06 апреля 2016

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

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

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

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

$ hg behead 123

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

2 голосов
/ 21 февраля 2011

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

hg clone --rev myGoodResition myDirtyRepo myCleanRepo
1 голос
/ 26 апреля 2019

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

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

hg prune -r revname

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

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

1 голос
/ 24 октября 2018

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

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

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 сохраняются в истории, но не влияют ни на что более новое.

0 голосов
/ 17 сентября 2015

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

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

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

  2. Раздень его.


Источник: TipsAndTricks .

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

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

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

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