У мене є пара комітетів, яка дійсно повинна бути лише однією. Якби я використовував git, я б використовував:
git rebase -i <some-commit-before>
а потім розчавити їх.
Чи можу я це зробити в меркуріалі? Якщо так, то як?
У мене є пара комітетів, яка дійсно повинна бути лише однією. Якби я використовував git, я б використовував:
git rebase -i <some-commit-before>
а потім розчавити їх.
Чи можу я це зробити в меркуріалі? Якщо так, то як?
Відповіді:
Так, ви можете зробити це за допомогою mercurial без будь-яких розширень, об'єднавши набори змін .
Якщо ви хочете використовувати розширення, ви можете використовувати:
Моя улюблена hg strip --keep
команда. І тоді я вношу всі зміни за один прихильність.
Це найшвидший і найзручніший спосіб для мене, тому що я люблю робити багато невеликих подій під час щоденної роботи;)
Примітка 1: для ввімкнення strip
потрібне вбудоване розширення mq
.
Примітка 2: Мій улюблений клієнт Git / Mercurial (SmartGit / Hg) додається за --keep
параметром за замовчуванням протягом strip
. І що ще зручніше: він пропонує опцію під назвою join commits
:]
hg strip --keep --rev [rev]
Де rev
номер редакції першого комітету, який ви хочете зробити скрінш з останнім
--rev
необов’язково, повна командаhg strip --keep [rev]
hg help strip
дає hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
, а пропускаюча редакція дає мені abort: empty revision set
.
hg strip
не найкраща ідея. Це не зовсім безпечно. Спробуйте hg histedit
, можливо, навіть спробуйте скористатися розширенням evolve.
Розширення 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 )
Якщо ви читаєте цю відповідь, ви можете забути будь-який інший варіант, згаданий у цій відповіді, і скористатися
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
опція ребазування охоплює це (слідом за позначенням редакцій як таємних або використанням смужки на них, як тільки ви перевірите результат). Навіть переміщення модифікацій між іншими редакціями можливе з послідовністю двох команд відновлення.
З 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
не вдасться.
Я думаю 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 =
Припустимо, ви хочете скоротити (об'єднати) два останні коміти.
Знайдіть номер редакції
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
М'яка гілка скидання
hg strip --keep -r 155
Знову здійснити зміни
hg commit -m "new commit message"
strip
вимагає вбудованого розширення. Створіть / редагуйте ~/.hgrc
конфігураційний файл із таким вмістом:
[extensions]
strip =