Mercurial - повернення до старої версії та продовження звідти


249

Я використовую Mercurial локально для проекту (це єдине репо, в якому немає натискання / тягнення до / з будь-якого іншого місця).

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

Я трохи плутаюся з командами branch// revert/ update -Cв Mercurial. В основному я хочу повернутися до версії 38 (зараз на 45), і наступні мої зобов’язання мають 38 як батьків і продовжувати звідти. Мені байдуже, чи редакції 39-45 втрачені назавжди або опиняються у власній тупиковій гілці.

Яка команда / набір команд мені потрібна?


6
Для всіх, хто цікавиться, це з’явилося на пов’язаній бічній панелі, що є чудовим поясненням відновлення відновлення: stackoverflow.com/questions/2506803/…
Paolo

Відповіді:


150
hg update [-r REV]

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


6
наступний комітет створить нове відділення. Якщо ви не впевнені, просто зробіть резервну копію вашого сховища (з робочою копією), спробуйте - не подобається результат -> почніть з нуля безкоштовно
van

Це сумнівна відповідь, оскільки вона об'єднує ваші поточні зміни зі старою редакцією, яка, мабуть, не потрібна. Правильною відповіддю має бути відновлення hg.
Trevor de Koekkoek

Відповідь прекрасна, за винятком трохи про злиття (я не думаю, що запитуючий не захоче злитися).
ctrl-alt-delor

3
@NeonWarge REV - це просто заповнювач ревізії. Це може бути його номер, хеш, закладка тощо. Тревор: це не сумнівно, оскільки воно нічого не зливає. Не має потреби.
DanMan

401

Ось шпаргалка з командами:

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

  • hg revertзмінює лише вміст файлу і залишає версію батьківської версії робочої копії самостійно. Зазвичай ви використовуєте, hg revertколи вирішите, що не хочете зберігати незаконні зміни, внесені до файлу, у своїй робочій копії.

  • hg branchпочинає нову названу гілку. Подумайте про названу гілку як мітку, яку ви присвоюєте наборам змін. Тож якщо ви це зробите hg branch red, то наступні набори змін будуть позначені як належні на "червоній" гілці. Це може бути приємним способом організації наборів змін, особливо коли різні люди працюють у різних галузях, і ви згодом хочете побачити, звідки походить набір змін. Але ви не хочете використовувати його у своїй ситуації.

Якщо ви використовуєте hg update --rev 38, то набори змін 39–45 залишаться як глухий кут - звисаюча голова, як ми це називаємо. Ви отримаєте попередження при натисканні, оскільки ви будете створювати "кілька головок" у сховищі, до якого ви натискаєте. Попередження є, оскільки це неначебно залишати такі голови навколо, оскільки вони припускають, що комусь потрібно зробити злиття. Але у вашому випадку ви можете просто йти вперед, і hg push --forceоскільки ви дійсно хочете залишити його висячим.

Якщо ви ще не натиснули редакцію 39-45 десь в іншому місці, тоді ви можете залишити їх приватними. Це дуже просто: з hg clone --rev 38 foo foo-38вами ви отримаєте новий локальний клон, який містить лише до редакції 38. Ви можете продовжувати працювати foo-38і висувати нові (хороші) набори змін, які ви створюєте. Ви все одно матимете старі (погані) зміни у своєму fooклоні. (Ви можете перейменовувати клони, як тільки захочете, наприклад, fooв foo-badі foo-38до foo.)

Нарешті, ви також можете скористатися, hg revert --all --rev 38а потім здійснити фіксацію. Це створить версію 46, яка буде схожа на версію 38. Потім ви продовжите роботу з версією 46. Цей бажання створити вилку в історії таким же явним чином, як hg updateі ви, але з іншого боку, ви не отримаєте скарги на наявність кілька головок. Я б використовував, hg revertякби співпрацював з іншими, хто вже зробив власну роботу на основі перегляду 45. В іншому випадку hg updateбільш чітко.


2
ДУМОВА відповідь. Я використав hg revert --all --rev ##, і це врятувало мою дупу: D
Van Thoai Nguyen

1
Чи не краще було б також закрити гілку звислої голови? Це дозволить запобігти майбутнім попередженням про сховище. Дивіться stackoverflow.com/a/3688320/900130
Zoltán

Примітка: hg revert --all --rev xxx змінить локальні файли, необхідні для повернення з того місця, де ви перебуваєте у вашому місцевому репо-репо. Тому вам потрібно оновити до того, звідки ви хочете повернутися.
Вінсент

Щоб відключити попередню версію, спершу довелося зробити відновлення, а потім оновлення. Як сказано, менш непрозоре пояснення, ніж більшість.
CodeLurker

30

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

hg revert path/to/file -r-2

Це -2повернеться до версії до останнього виконання, використовуючи -1лише повернення поточних непосланих змін.


1
Я вважаю це надзвичайно корисним. Звичайно для опції -r ви можете просто вказати номер редакції
Алекс

Ви також можете вибрати конкретну версію. наприкладhg revert path/to/file -r478
Метт

7

ІМХО, hg strip -r 39краще підходить цьому випадку.

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


Не знав про це. Простіше та чистіше, ніж видалення та повторне клонування репо. Дякую.
Відновіть Моніку - немайнард

6

Після використання hg update -r REVне було зрозуміло у відповіді про те, як здійснити цю зміну, щоб потім можна було натиснути.

Якщо ви просто спробуєте зробити зобов’язання після оновлення, Mercurial не вважає, що зміни є.

Спершу мені довелося внести зміни до будь-якого файлу (скажімо, у README), щоб Mercurial визнав, що я вніс нову зміну, потім я міг зробити це.

Потім це створило дві голови, як згадувалося.

Щоб позбутися іншої голови перед тим, як натиснути, я пішов після кроку без об'єднань, щоб виправити цю ситуацію.

Я тоді зміг штовхнути.


ви можете зробити commit --close-branchна старій гілці. Можна також push -fштовхати нові голови, але це може спричинити плутанину щодо того, яке воно є поточним.
ctrl-alt-delor

5

Відповіді вище були найбільш корисними, і я багато чого навчився. Однак для моїх потреб лаконічна відповідь:

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"

де ${1}номер перегляду чи назва філії. Ці два рядки насправді є частиною bash-скрипту, але вони добре працюють, якщо ви хочете це зробити вручну.

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


1

Я б встановив Tortoise Hg (безкоштовний графічний інтерфейс для Mercurial) і використаю це. Потім ви можете просто клацнути правою кнопкою миші на версію, до якої ви хочете повернутися - із усіма повідомленнями про фіксацію перед вашими очима - та "Повернути всі файли". Робить інтуїтивно зрозумілим та легким прокручування назад та вперед між версіями набору файлів, що може бути дуже корисно, якщо ви хочете встановити, коли проблема з’явилася вперше.

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