Чи є можливість видалити місцеві комісії в Mercurial?


209

Тож я продовжую робити дурну помилку в Меркуріалі. Часто я починаю роботу, не роблячи "тягнути hg" та "hg update". Коли я намагаюся підштовхнути свої зміни, я отримую помилку.

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

Знову ж таки, я лише намагаюся видалити локальні комітети, зроблені за допомогою "hg ci". Я не хочу змінювати файли, повертати і т.д.


Можливий дублікат stackoverflow.com/questions/2139165/…
N 1.1,

12
Це не дурна помилка, це нормальний робочий процес, коли кілька людей працюють з одним сховищем одночасно.
Juozas Kontvainis

Відповіді:


247

Увімкніть розширення " смужка " та введіть таке:

hg strip #changeset# --keep

Де #changeset#знаходиться хеш для набору змін, який ви хочете видалити. Це видалить згаданий набір змін, включаючи набори змін, що спускаються з нього, і залишить ваш робочий каталог недоторканим . Якщо ви також хочете повернути свої скоєні зміни коду, видаліть цю --keepопцію.

Для отримання додаткової інформації перевірте розширення Strip .

Якщо ви отримаєте команду "unkown command 'strip" ", можливо, вам потрібно буде її ввімкнути. Для цього знайдіть файл .hgrcчи Mercurial.iniфайл та додайте до нього наступне:

[extensions]
strip =

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

stripКоманда корисна , коли ви дійсно хочете позбутися від ревізій , які забруднюють гілка. Насправді, якщо ви знаходитесь у ситуації з цим питанням і хочете остаточно видалити всі набори змін "чернетки" , ознайомтеся з головною відповіддю , яка в основному пропонує:

hg strip 'roots(outgoing())'

8
@Bharath: Вам потрібно ввімкнути розширення
Samaursa

1
Оскільки mercurial 2.8, смуга є окремим розширенням, тому просто strip = чудово. WhatsNew for Mercurial 2.8
Chih-Hsuan Yen

104

Якщо ви використовуєте Hg черепаху, просто активуйте розширення " смужка " у:

  1. Файл / Налаштування / Розширення /
  2. Виберіть смужку

Потім виберіть нижню редакцію, з якої ви хочете почати розшифровку, зробивши right clickна ній і вибравши:

  1. Змінення історії
  2. Смуга

Просто так:

введіть тут опис зображення

У цьому прикладі це буде стерто з 19-ї редакції до останньої, що відбулася (22).


2
File/Settings/Extensions/Я б хотів, щоб я міг додати більше голосів. Велике спасибі!
дятченко

Арг! Я спробував це, але, здавалося, скидає всі мої зміни, незважаючи на те, що не перевіряв "немає резервної копії" чи "відкинути локальні зміни". Я хотів утримати ці зміни, тільки не вчинити їх! Чи є зараз спосіб їх відновити ??
Тім Тісдалл

2
Я не можу знайти спосіб зробити це належним чином, але, схоже, зберегти вміст, який потрібно пройти, --keepі TortoiseHg не дає такої можливості. Отже ... вам потрібно зробити це в командному рядку з hg strip -r . --keep.
Тім Тісдалл

3
з довідки про стриптиз: 'Будь-які наборі змін, які зберігаються, зберігаються у ".hg / strip-backup" як пакет (див. "hg help bundle" та "hg help unbundle"). Їх можна відновити, запустивши "hg unbundle .hg / strip-backup / BUNDLE", де BUNDLE - файл пакету, створений смугою. '
Тім Тісдалл

У SourceTree це було також корисно. Дякую!
Пономаренко Олег

22

Сучасна відповідь (актуальна лише після Mercurial 2.1):

Використовуйте фази та позначте версію, яку ви не хочете ділити як таємну (приватну). Таким чином, коли ви натискаєте, вони не будуть відправлені.

У TortoiseHG ви можете клацнути правою кнопкою миші на команді, щоб змінити її фазу.

Також: Ви також можете використовувати розширення "rebase" для переміщення місцевих комісій на голову спільного сховища після того, як ви потягнете.


Приватний == секрет зараз
Дмитро Осиновський

15

Як зазначають усі, вам, мабуть, слід просто потягнути, а потім об'єднати голови, але якщо ви дійсно хочете позбутися своїх зобов’язань без жодного інструменту EditingHistory, ви можете просто hg clone -rзробити репо, щоб отримати всі, крім цих змін.

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


Чи "hg clone -r" видаляє локальні зміни? Я просто хочу видалити місцеві комісії, щоб все було просто.
користувач191535

4
Він не видаляє їх із клонованого сховища, але створює новий клон, у якому їх немає. Тоді ви можете видалити змінене репо, якщо хочете.
Bra4 Ry4an Brase

9

Я також натрапив на цю проблему. Я зробив 2 commitі хотів відкатати та видалити обидва коміти.

$ hg rollback

Але hg rollbackпросто відкочується до останнього комітету, а не 2 коміти. У той час я цього не усвідомлював і змінив код.

Коли я виявив, hg rollbackщо тільки повернув назад одну позицію, я виявив, що можу використати hg strip #changeset#. Отже, я hg log -l 10знаходив останні 10 комітів і отримував потрібний набір змін, який я хотів strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

Що abort: local changes foundозначає? Це означає, що hgзнайдені зміни в коді ще не здійснені. Отже, щоб вирішити це, вам слід hg diffзберегти змінений код і hg revertта hg strip #changeset#. Просто так:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

Після того, як ви зробите вищезазначене, ви можете patchрозробити файл diff, і ваш код можна додати до проекту.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

Ви можете подолати це ще простіше за допомогою розширення Rebase , просто використовуйте, hg pull --rebaseі ваші зобов'язання автоматично повертаються до витягнутої версії, уникаючи проблеми з розгалуженням.


1
За рахунок наявності неточної історії та можливої ​​корупції, якщо ви робите щось не так.
Bra4 Ry4an Brase

5

Якщо ви знайомі з git, ви з радістю будете використовувати histedit, який працює так git rebase -i.


4

hg stripце те, що ви шукаєте. Це аналогічно, git resetякщо ви знайомі з git.

Використовуйте консоль:

  1. Вам потрібно знати номер ревізії. hg log -l 10. Ця команда показує останні 10 комітів. Знайдіть комісію, яку шукаєте. Вам потрібно 4-значний номер з рядка зміниchangeset: 5888:ba6205914681

  2. Потім hg strip -r 5888 --keep. Це видаляє запис про вчинення, але зберігає всі файли модифікованими, і тоді ви можете їх повторно. (якщо ви хочете видалити файли, просто видаліть --keephg strip -r 5888


1

[Hg Черепаха 4.6.1] Якщо це нещодавня дія, ви можете скористатися дією "Відкат / Скасувати" (Ctrl + U).

Зображення черепахи HG


Двічі перевірте включення зображення.
Білл Келлер

0

Окрім видатної відповіді Самаурси, ви можете використовувати evolveрозширення pruneяк безпечну та відновлювану версію, stripяка дозволить вам повернутися назад, якщо ви зробите щось не так.

У мене є ці псевдоніми .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

Зверніть увагу, що так pruneсамо --keep, як stripі для збереження робочої каталоги, недоторканою, що дозволяє повторно передавати файли.

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