Откат к старой ревизии в Mercurial (например, git reset)

используя git, я могу отбросить ошибочную или случайную фиксацию, используя команду

git reset --soft HEAD^

, который сбрасывает текущую ветку (например,master) к родительской фиксации текущей редакции HEAD^ не касаясь рабочего дерева-вы можете заменить --soft С --hard если вы хотите уничтожить рабочее дерево, а также.

кроме того, если я хочу избавиться от более чем один коммит, я могу использовать команду

git reset --hard 53b94d0

что возвращает меня назад точно совершить 53b94d0, как будто я никогда ничего не совершал после этого.

что такое эквивалент ртути (hg)?

1 ответов


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

откат hg

если вы специально хотите отменить свой последний коммит, вы можете использовать:

hg rollback

который отменит фиксацию (которая не касается рабочего дерева – вы должны быть в состоянии следовать за ним с hg revert --all или hg update -C если вы хотите сбросить весь рабочий каталог).

HG clone-r

Предположим, вы хотите сбросить свой репозиторий под названием giraffe к редакции 77182fb7451f. Если ты ... --9--> в родительский каталог и запустите:

hg clone -r 77182fb7451f giraffe new-giraffe
cp giraffe/.hg/hgrc new-giraffe/.hg/

тогда вы получите new-giraffe, репозиторий в редакции 77182fb7451f. (The cp необходимо обеспечить, чтобы новый-жираф paths (например, "пульты" git) правильно указывают на исходное РЕПО, а не на giraffe папка, как это было бы по умолчанию.)

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

НД полоса

если вы хотите сделать более сложные вещи с изменением истории фиксации (которая, кстати, несколько нахмурилась в мире hg), сначала включите Очереди Mercurial расширение путем добавления следующих строк к вашему .hgrc (нет необходимости указывать путь после знака равенства):

[extensions]                                                                    
mq =

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

hg strip 1cc72d33ea76

если 1cc72d33ea76 является первым "плохим" набором изменений в вашем репозитории, который вы хотите удалить.

к сожалению, это часто трудно удалить точно правильные наборы изменений с помощью этого метода, и это слишком легко в конечном итоге с несколькими головками (которые вы можете просмотреть с помощью hg heads), требующий утомительного повторного применения hg strip прежде чем вы сможете добраться туда, где вы хотите быть без дополнительных глав.

HG газа с помощью revsets

используя revsets НД вы можете удалить все предки . (текущая редакция), которые являются не предки ревизии вы хотите вернуться, используя команду типа:

hg strip "ancestors(.) and not ancestors(77182fb7451f)"

убедитесь, что первый запуск:

hg log -r "ancestors(.) and not ancestors(77182fb7451f)"

, который покажет вам все наборы изменений, которые hg strip удалит, поэтому вы можете убедиться, что вы не нанесете непоправимый вред своей истории фиксации (потому что у вас есть резервные копии... правильно?).