Чи можу я зробити сквош в Меркуріалі?


109

У мене є пара комітетів, яка дійсно повинна бути лише однією. Якби я використовував git, я б використовував:

git rebase -i <some-commit-before>

а потім розчавити їх.

Чи можу я це зробити в меркуріалі? Якщо так, то як?

Відповіді:


88

Так, ви можете зробити це за допомогою mercurial без будь-яких розширень, об'єднавши набори змін .

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


Так, я знайшов цю відповідь із тих питань, які мені подобалися в коментарі до загального питання. Я думаю, що це ваша відповідь на це.
Ry4an Brase

4
Невелика бічна примітка: розширення Histedit поширюється за допомогою Mercurial 2.3 і пізніших версій. Ви просто повинні це включити.
Паїджі

1
У документі Concatenating Changesets використовується абстрактні поняття "repos", як я посилаюся на ці? Наприклад: hg -R oldrepo експорт ... виробляє "abort: сховище oldrepo не знайдено!
Олександр Левчук

13
Просто спробую розім’яти 2 коміти. Мені справді потрібна вікі-сторінка з 10+ командами чи альтернативними розширеннями?
Олександр Левчук

3
Дивіться коментарі. Тепер Histedit вбудований, вам просто потрібно включити його (адже жодні команди за замовчуванням не змінять історію)
Ry4an Brase

43

Моя улюблена hg strip --keepкоманда. І тоді я вношу всі зміни за один прихильність.

Це найшвидший і найзручніший спосіб для мене, тому що я люблю робити багато невеликих подій під час щоденної роботи;)


Примітка 1: для ввімкнення stripпотрібне вбудоване розширення mq.
Примітка 2: Мій улюблений клієнт Git / Mercurial (SmartGit / Hg) додається за --keepпараметром за замовчуванням протягом strip. І що ще зручніше: він пропонує опцію під назвою join commits:]


4
Повна команда для hg strip є: hg strip --keep --rev [rev] Де revномер редакції першого комітету, який ви хочете зробити скрінш з останнім
Nicolas Forney

3
@NicolasForney Не зовсім, --revнеобов’язково, повна командаhg strip --keep [rev]
G. Demecki

Перегляд є обов'язковим для мене в 3.3.3: hg help stripдає hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..., а пропускаюча редакція дає мені abort: empty revision set.
Роман Старков

3
Використання hg stripне найкраща ідея. Це не зовсім безпечно. Спробуйте hg histedit, можливо, навіть спробуйте скористатися розширенням evolve.
Мартін Томсон

Найбільш природним чином здається людям з git;)
foo

32

Розширення Rebase працювало як шарм. Для сквош 2 комітів:

$ hg rebase --dest .~2 --base . --collapse

Dot - це ярлик для поточного перегляду.

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

$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse

Як це працює:

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

(від http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )


1
Де ви знайшли "~ 2" для двох комітів?
Мі-Ла

1
Це пояснено в темі revsets, див. Довідку щодо hg revsets.
markand

13

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

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

[extensions]
evolve = ~/evolve/hgext/evolve.py

Якщо припустити, що ви клонували еволюцію репо в домашній каталог. Тепер вам добре піти. Ви також можете звернутися за допомогою до hg help fold.

Згорнути команду

Ви кажете foldрозчавити / скласти лінійний ланцюжок комітетів, який не розірваний. Що таке складка, це створює новий набір змін, який містить зміни з усіх наборів змін і позначає всі ці комісії як застарілі. Ви можете більш глибоко переглянути це в документах .

Тепер припустимо, у вас є така історія.

a -> b -> c -> d -> e -> f -> g

Хочеш сквош e, fі g. Ви можете зробити

hg up g
hg fold -r e

Результат буде

a -> b -> c -> d -> h

де hнабір змін, який містить зміни від усіх трьох комітів e, fі g.

Ви також можете складати набори змін з середини історії, тобто необов'язково потрібно вибрати ланцюжок, що включає наконечник. Припустимо , ви хочете скинути b, cі d. Ви можете зробити

hg up d
hg fold -r b
hg evolve --all

Це призведе до

a -> i -> j

де iзнаходиться складений з ревізії b, c, dі jодне і те ж , як набір змін h. Посібник користувача Evolve обов’язково читається.


Схоже, що база даних охоплює більшість (можливо, всі?) Випадків використання цього розширення, і, безумовно, той, про який задають у цьому питанні. Особливістю вбивці цього розширення є приховування (а не видалення) змін, які ви замінюєте, але --keepопція ребазування охоплює це (слідом за позначенням редакцій як таємних або використанням смужки на них, як тільки ви перевірите результат). Навіть переміщення модифікацій між іншими редакціями можливе з послідовністю двох команд відновлення.
Артур Такка

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

"NameError: ім'я" execfile "не визначено" - що означає, що еволюція записується в Python 2, що в основному є кам'яним віком.
Ніл G

1
@NeilG mercurial ще не підтримує Python 3.
Pulkit Goyal

2
@NeilG так, спільнота ртутних програм працює над тим, щоб якнайшвидше отримати підтримку py3.
Пулкіт Гоял

1

З Mercurial 4.8 (листопад 2018, 9 років пізніше) ви могли розглянути нову команду hg absorb(раніше вона була експериментальною функцією ).

Див. " Поглинання змін комісії в Mercurial 4.8 "

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

На технічному рівні hg absorbвиявляє всі невідомі зміни та спроби відобразити кожну змінену лінію на однозначну попередню фіксацію.
Для кожної зміни, яка може бути чітко відображена на карті, незапущені зміни поглинаються у відповідну попередню комісію. Коміти, на які впливає операція, перезаряджаються автоматично.
Якщо зміну неможливо віднести до однозначної попередньої фіксації, вона залишається відключеною, і користувачі можуть повернутися до існуючого робочого процесу (наприклад, використовуючи hg histedit).

Логіка автоматичного перезапису hg absorbреалізації реалізована за дотриманням історії рядків: Це принципово відрізняється від підходу, який застосовується hg histeditабо git rebase, які, як правило, покладаються на стратегії злиття, засновані на 3-х напрямному злитті, щоб отримати нову версію файлу з декількома входами версії.

Цей підхід у поєднанні з тим, що hg absorb пропускає зміни через неоднозначне застосування програми, означає, що hg absorb ніколи не зіткнеться з конфліктами злиття!

Тепер ви можете думати, якщо ігнорувати лінії з неоднозначними цілями програми, патч завжди буде застосовуватися чисто, використовуючи класичне 3-х напрямне злиття. Це твердження логічно звучить правильно. Але це не так: hg absorbможна уникнути конфліктів злиття, коли злиття здійснюється hg histeditабо git rebase -iне вдасться.


0

Я думаю chistedit(побудований з Mercurial 2.3) є найближчим до того, rebase -iщо є чистим Mercurial ( chisteditце інтерактивна версія histedit). Після того, як введено hisitit foldкомандних карт для перезавантаження squashі rollкомандних карт для ребатів fixup. Докладнішу інформацію див. У документах histedit .

Ось простий приклад. Припустимо, у вас є наступне і ви хочете перенести всі зміни 1e21c4b1 у попередню редакцію та просто зберегти повідомлення попередньої редакції.

@  1e21c4b1 drees tip
|  A commit you want to squash
o  b4a738a4 drees
|  A commit
o  788aa028 drees
|  Older stuff

Ви можете запустити hg chistedit -r b4a738a4редагування історії назад до b4a738a4. Після цього ви перейдете курсором до 1e21c4b1 і натисніть, rщоб вказати, що хочете скасувати цю версію. Зауважте, що порядок у histedit (найдавніший до найновішого) змінюється від hg log(найновіший до найдавнішого).

#0  pick   160:b4a738a49916   A commit
#1  ^roll  161:1e21c4b1500c

Вибравши зміни, ви вирішите cїх здійснити. Результат такий:

@ bfa4a3be має підказку | Комісія o 788aa028 drees | Старіші речі

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

Зверніть увагу, щоб використовувати будь-якого histeditабо chisteditвам потрібно додати histeditдо розширень в файлі ~ / .hgrc:

[extensions]
histedit =

Я запропонував, chisteditоскільки це найближче до rebase -iта працює де-небудь в історії. Якщо ви просто хочете підписати / змінити поточну редакцію у попередній, тоді @G. Пропозиція Демецького stripможе бути хорошою, оскільки те, що відбувається, зрозуміло. Він вбудований з Mercuria 2.8. Для отримання еквівалентних результатів, як описано вище, ви можете зробити наступне:

hg strip .
hg add
hg commit --amend

Зауважте strip, як і histedit, потрібно ввімкнути ваш ~ / .hgrc:

[extensions]
strip =

0

Припустимо, ви хочете скоротити (об'єднати) два останні коміти.

  1. Знайдіть номер редакції

    hg log -G -l 3
    

    можливий вихід:

    @  changeset:   156:a922d923cf6f
    |  branch:      default
    |  tag:         tip
    |  user:        naXa!
    |  date:        Thu Dec 13 15:45:58 2018 +0300
    |  summary:     commit message 3
    |
    o  changeset:   155:5feb73422486
    |  branch:      default
    |  user:        naXa!
    |  date:        Thu Dec 13 15:22:15 2018 +0300
    |  summary:     commit message 2
    |
    o  changeset:   154:2e490482bd75
    |  branch:      default
    ~  user:        naXa!
       date:        Thu Dec 13 03:28:27 2018 +0300
       summary:     commit message 1
    
  2. М'яка гілка скидання

    hg strip --keep -r 155
    
  3. Знову здійснити зміни

    hg commit -m "new commit message"
    

Примітки

stripвимагає вбудованого розширення. Створіть / редагуйте ~/.hgrcконфігураційний файл із таким вмістом:

[extensions]
strip = 

-1

Я використовую:

hg phase --draft --force -r 267
...
hg rebase --dest 282 --source 267 --collapse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.