Меркурій скасує останнє введення


125

Як я можу скасувати останню випадково скоєну (не натиснуту) зміну в Mercurial?

Якщо це можливо, було б кращим способом зробити це з TortoiseHg.

Оновлення

У моєму конкретному випадку я здійснив набір змін (не натискав). Потім я витягнув і оновив з сервера. Завдяки цим новим оновленням я вирішив, що остання фіксація застаріла, і я не хочу її синхронізувати. Тож здається, що hg rollbackце не саме те, що я шукаю, тому що це відкине потяг замість моєї фіксації.


1
А як зробити два hg rollback, а потім знову потягнути?
VonC

1
Перший відкат скасовує витяг, другий відкат каже мені "немає інформації про відкат".
Мартін Буберл

1
Я стикався з тією ж ситуацією, і наскільки я знаю, що після того, як ви зробили будь-яку іншу операцію - ви не можете повернутися назад або вийняти її з історії. Вам потрібно буде повторно клонувати сховище hg.

3
strip --keep: stackoverflow.com/questions/29413851/… безпосередньо вирішує завдання, як і QQport MQ. Крім того, може бути краще просто rebaseв сценарії, якщо місцеві зміни також мають бути збережені і не буде конфлікту. (Використовуйте об'єднання, щоб зберегти деякі комбіновані зміни з обох гілок, коли це бажана кінцева мета графа, особливо у випадку, який не є швидким вперед.) Це також може бути справедливим лише для закриття гілки, яка все ще "зберігає історію" (але інакше, ніж злиття) залежно від бажаного кінцевого стану.
користувач2864740

2
Як @ user2864740 каже, hg strip --keepце команда зробити використання, але ви повинні забезпечити перегляд, наприклад: hg strip --keep -r .. Ця відповідь добре пояснює stackoverflow.com/a/19064016/1286571
ForeverWintr

Відповіді:


77

Один із способів був би hg rollback (застаріло станом на 2,7 серпня, серпень 2013 року)

Будь ласка, використовуйте hg commit --amendзамість rollbackвиправлення помилок в останньому комітеті.

Відмовити останню транзакцію у сховищі.

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

Дивіться розділ відновлення TortoiseHg :

alt текст

Ця нитка також детально різницю між hg rollbackі hg strip:
(автор Martin Гейслер , який також вносить свій внесок в SO)

  • " hg rollback" видалить останню транзакцію. Операції - це поняття, яке часто зустрічається в базах даних. У Mercurial ми починаємо транзакцію, коли виконуються певні операції, такі як фіксація, натискання, потяг ...
    Коли операція закінчується успішно, транзакція позначається як завершена. Якщо трапляється помилка, транзакція "повертається назад" і сховище залишається в тому ж стані, що і раніше.
    Ви можете вручну запустити відкат за допомогою "hg відкату". Це скасує останню транзакційну команду. Якщо команда pull принесла 10 нових наборів змін у сховище на різних гілках, то " hg rollback" видалить їх усі. Зверніть увагу: при відказі транзакції немає резервного копіювання !

  • ' hg strip' видалить набір змін і всіх його нащадків. Набори змін зберігаються у вигляді пакету, який ви можете застосувати знову, якщо вони вам потрібні.

ForeverWintr пропонує у коментарях (у 2016 році, через 5 років)

Ви можете "скасувати" файли, попередньо забувши їх, наприклад:, hg forget filea; hg commit --amendале це здається неінтуїтивним.
hg strip --keepмабуть, краще рішення для сучасних hg.


Коли я розумію, що правильний відкат видаляє останню транзакцію. У моєму випадку я зробив зобов’язання, потім я витягнув з сервера. Отже, це означає, що я б відкинув тягу замість фіксації?
Мартін Буберль

1
@Martin Buberl: За даними selenic.com/mercurial/hg.1.html#rollback , тягнення вважається транзакцією. Тож якщо ви потягнули, виконання hg rollbackбуде скасувати витяг замість комітету.
Тім Геніган

2
Я не впевнений, як hg commit --amendце має працювати, але для мене це дозволило мені редактору змінити повідомлення про фіксацію, і жоден метод змінити, які файли були включені. Я вийшов із редактора, не зберігаючи і виявив, що мій помилковий пристрій було змінено, щоб включити ВСІ змінені файли!
Тім Тісдалл

2
Мені не зрозуміло, як досягти відповіді на запитання, використовуючи hg commit --amend. Ви можете "скасувати" фіксацію файлів, спочатку hg forgetвідправивши їх, наприклад:, hg forget filea; hg commit --amendале це здається неінтуїтивним. hg strip --keep , мабуть, краще рішення для сучасних hg.
ForeverWintr

1
@JasonS book.mercurial-scm.org/read / ... читається добре, хоча в вашому випадку, ви могли б також розглянути скидання рт.ст .: stackoverflow.com/a/31302998/6309
VonC

46

hg strip повністю видалить ревізію (та будь-яких нащадків) із сховища.

Щоб використовувати смугу, вам потрібно буде встановити MqExtension , додавши наступні рядки до .hgrc (або mercurial.ini):

[extensions]
mq =

У TortoiseHg смуга команди доступна на робочому столі. Клацніть правою кнопкою миші на версію та виберіть "Змінити історію" -> "Стрип".

Оскільки stripзмінюється історія сховища, ви повинні використовувати його лише для версій, які ще ні з ким не ділилися. Якщо ви використовуєте mercurial 2.1+ або більше, ви можете використовувати фази для відстеження цієї інформації. Якщо комісія все ще знаходиться у фазі чернетки, вона не поділяється з іншими сховищами, тому ви можете сміливо знімати її. (Дякую Засуру, що вказав на це).


2
Якщо відповідна редакція все ще є у проекті фрази (або у вас є доступ до ВСІХ репо, на які вона була натиснута / потягнута, і нанесіть смужку на всі) (що стосується цього опису), тоді це sooo найкращий і чистий варіант.
ГазБ

4
Якщо у вас встановлений TortoiseHg, є графічний інтерфейс для глобальної активації mq. У поточній версії: увімкніть "файл-> налаштування-> вкладку глобальних налаштувань-> розширення-> mq" або перейдіть до файлу налаштувань за допомогою кнопки "Редагувати файл".
Девід

19

Оскільки ви не можете відкатати, ви повинні об'єднати цю команду в нову голову, яку ви отримали, коли ви тягнули. Якщо ви не хочете, щоб якась робота, яку ви робили в ній, ви можете легко зробити це, скориставшись цією порадою .

Тож якщо ви потягли та оновили їх голову, ви можете зробити це:

hg --config ui.merge=internal:local merge

зберігає всі зміни в переглянутій редакції, і жодна з змін не перевіреної редакції (тієї, яку ви написали, що більше не хочете).

Це чудовий спосіб зробити це, оскільки він зберігає вашу історію точною та повною. Якщо через 2 роки хтось виявить помилку в тому, що ви збили, ви можете заглянути в свою (невикористану, але збережену) реалізацію того самого, і перейти, "о, я це зробив правильно". :)


5

hg rollback це те, що ти хочеш.

У TortoiseHg hg rollbackце зроблено в діалоговому вікні фіксації. Відкрийте діалогове вікно фіксації та виберіть "Скасувати".

alt текст


1
Я взяв на себе зобов’язання, потім потягнути та оновити / синхронізувати. Завдяки цим новим змінам, які я отримав, я вирішив, що остання фіксація застаріла, і хочу скасувати її. Кнопка Скасувати в TortoiseHg у моєму випадку відключена.
Мартін Буберль

Відкат тепер застарілий.
UpTheCreek

У поточній версії Tortoise HG ви можете перейти до опції "Відкат / скасування" з пункту меню "Репозиторій".
daveywc

Потрібно цитування @UpTheCreek.
DanMan

@DanMan - перевірте надане ним посилання.
UpTheCreek

3

У поточній версії TortoiseHg Workbench 4.4.1 (07,2018) , ви можете використовувати Repository- Rollback/undo...:
введіть тут опис зображення


1

Його вирішення.

Якщо ви не натиснете на сервер, ви будете клонуватися в нову папку, що ще вимиває (видалити всі файли) зі своєї папки сховища, і клонувати нову.


0

після того, як ви витягнули та оновили робочу область, зробіть thg і клацніть правою кнопкою миші на наборі змін, який ви хочете позбутися, а потім натисніть кнопку «змінити історію -> смуга», він видалить набір змін, і ви вкажете на підказку за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.