Як мені git reset --hard HEAD на Mercurial?


76

Я користувач Git, який намагається використовувати Mercurial.

Ось що сталося: я зробив hg backoutнабір змін, який хотів повернути. Це створило нову голову, тому hg доручив мені об’єднати (я повертаюся до "за замовчуванням") Після злиття він сказав мені, що я все ще маю зобов'язання. Потім я помітив щось, що я зробив неправильно, вирішуючи конфлікт в процесі злиття, і вирішив, що хочу мати все, як раніше hg backout, тобто я хочу, щоб це нероз'єднане злиття пішло. На Git цей некоммітований матеріал міститься в індексі, і я б просто git reset --hard HEADвидалив його, але, з того, що я прочитав, індекс не існує на Mercurial. То як я можу відмовитись від цього?


Відповіді:


94

Якщо ви ще не здійснили комісію, і схоже, що ні, ви можете скасувати всю роботу зі злиттям hg update --clean.

Тим НЕ менше, в новіших ртутних х є зручна команда для повторного злиття в один файл: hg resolve path/to/file.ext. З hg help resolve:

The available actions are: ...

 4) discard your current attempt(s) at resolving conflicts and

перезапустіть злиття з нуля: "hg file file ..." (або "-a" для всіх невирішених файлів)


Вибачте, я все ще трохи заплутався: я побіг hg up -C, але коміт "відступив" все ще знаходиться на кінчику моєї гілки. Я думав, що це "гілка привидів", яка була створена за допомогою backout, але виконується hg branchповернення default, тож я все-таки на головній гілці?
Helder S Ribeiro

5
Ви можете мати дві голови з однаковою гілкою, і це у вас є. Їх обох називають default. Це цілком нормальна ситуація в ртуті, і hg headsце команда, яку ви використовуєте для її виявлення / розуміння. Коли ви запускали hg backoutйого, "Здійснюйте резервні копії змін як новий набір змін", щоб створити новий набір змін, який не зникне без героїчних зусиль. Отже, у вас є дві голови, обидві у гілці з іменем за замовчуванням. Після того, як ви hg merge(і здійсните це), ви повернетесь до однієї голови у гілці з іменем за замовчуванням.
Ry4an Brase,

24

Це близько:

hg update --clean


5
так ... іноді, хоча, коли ви переміщуєте файли (з одного каталогу в інший), а потім вирішуєте подряпати все, це робить не те саме, git reset --hardщо робить. Ergo - ртутний дурний
iLemming

13

З git, команди:

git reset --hard     # reset to last commit    
git clean -df        # delete untracked files

дорівнюють

hg update --clean    # reset to last commit  
hg purge             # delete untracked files

8
Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду.
Kyll

git reset --hardне видаляє файли, що не відслідковуються.
Руслан

Не працює у мене. hg update --clean 18:8e139889ff02говорить "оновлено 2 файли", однак, коли я переглядаю журнал, він все ще там, де був. UPD : тим не менш, він перезавантажив файли до версії. Що, git reset --hardоднак, становить лише половину поведінки.
Hi-Angel

11

На сторінці GitConcepts керівництва Hg пояснюється, як виконувати багато дій git, знайомих користувачам у Mercurial.

Mercurial не має жодної вбудованої git reset --hardповедінки. Однак stripрозширення надає stripкоманду, яка робить це. Для використання спочатку увімкнітьstrip у своєму ~/.hgrcфайлі ::

[extensions]
strip =

Примітка: це розширення поставляється новим у Mercurial 2.8. Попередні версії надавали stripкоманду в mqрозширенні .

Тепер ви можете запускати такі команди, як hg stripабо навіть hg help strip. Щоб видалити набір змін та всі його дочірні елементи, просто вкажіть цей набір змін як аргумент hg strip. Наприклад, для видалення останнього щойно зробленого коміту (після того, як ви використали команди, які призвели hg rollbackдо повідомлення про відсутність транзакції для відкоту), ви можете видалити tipревізію. Кожного разу, коли ви запускаєте цю команду, буде вилучено чергову редакцію. hg stripдії Росії слід вважати незворотними; незнайомі користувачі повинні зробити резервні копії своїх сховищ перед використанням.

$ hg strip tip

Наприклад, із синтаксисом revsets я вказую , що хочу видалити будь-які мої коміти, в результаті яких при запуску відображаються зайві голови hg heads. Якщо ви вказали конкретну редакцію у наведеному нижче виразі, крім tip, у поточній гілці буде обрізано все, що не є родоначальником вибраної вами редакції. Це здається найбільш близьким до поведінки, яку я хочу, коли я видаю команду git reset --hard HEAD.

$ hg strip "branch(tip) and not(ancestors(tip)::tip)"

2
Mercurial 2.8 і вище має stripрозширення, якщо потрібно лише hg stripявно вказати команду. Використання також mqдодає безліч інших команд управління виправленнями.
davidjb

У TortoiseHg 4.7 та новіших версіях це можна ввімкнути за допомогою Файл> Налаштування> Розширення, а потім перевірити смужку та перезапустити TortoiseHg. Потім Перегляд> ShowConsole, щоб отримати командний рядок, щоб ввести, наприклад, hg strip --keep -r 50
Assad Ebrahim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.