У меня есть пара коммитов, которые действительно должны быть одними. Если бы я использовал 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 коммита:
Точка - это ярлык для текущей версии.
Это еще проще, когда у вас есть несколько коммитов в ветке и вы хотите свернуть их все в один:
Как это работает:
(из http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
источник
evolve
это расширение mercurial, которое помогает нам иметь безопасную изменяемую историю, хотя оно все еще экспериментально. Вы можете использовать его путем клонирования его из репозитория и добавления его в .hgrc , как это.Предполагая, что вы клонировали репозиторий Evolve в своем домашнем каталоге. Теперь можно идти. Вы также можете обратиться за помощью по адресу
hg help fold
.Сложить команду
Вы говорите
fold
сжать / свернуть линейную цепочку коммитов, которая не нарушается. Что делает fold, так это то, что он создает новый набор изменений, который содержит изменения из всех наборов изменений и помечает все эти изменения как устаревшие. Более подробно об этом можно прочитать в документации .Теперь предположим, что у вас есть следующая история.
Вы хотите раздавить
e
,f
иg
. Ты можешь сделатьРезультат будет
где
h
- набор изменений, содержащий изменения из всех трех коммитовe
,f
иg
.Вы также можете складывать ревизии из середины истории, то есть не обязательно выбирать цепочку, которая включает подсказку. Предположим, вы хотите сбросить карты
b
,c
иd
. Ты можешь сделатьЭто приведет к
где
i
находится сложенный из ревизииb
,c
,d
иj
одно и то же , как набор измененийh
. Обязательно прочтите руководство пользователя Evolve .источник
--keep
опция перебазирования покрывает это (с последующей пометкой ревизий как секретных или использованием полосы после проверки результата). Даже перемещение ревизий между другими ревизиями возможно с помощью последовательности двух команд перебазирования.В Mercurial 4.8 (ноябрь 2018 г., 9 лет спустя) вы можете рассмотреть новую команду
hg absorb
( раньше это была экспериментальная функция ).См. « Поглощение изменений фиксации в Mercurial 4.8 »
источник
Я думаю
chistedit
(встроенный с Mercurial 2.3) наиболее близок кrebase -i
чистому Mercurial (chistedit
это интерактивная версияhistedit
). Попав в histedit,fold
команда сопоставляется с rebase,squash
аroll
команда - с rebasefixup
. См. Документацию histedit для получения дополнительной информации.Вот простой пример. Предположим, у вас есть следующее и вы хотите переместить все изменения 1e21c4b1 в предыдущую ревизию и просто сохранить сообщение предыдущей ревизии.
Вы можете запустить,
hg chistedit -r b4a738a4
чтобы отредактировать историю обратно на b4a738a4. В chistedit вы затем наведите курсор на 1e21c4b1 и нажмите,r
чтобы указать, что вы хотите откатить эту ревизию. Обратите внимание, что порядок в histedit (от самого старого к самому новому) меняется на противоположныйhg log
( от самого нового к самому старому).Выбрав свои изменения, вы затем
c
решаете их зафиксировать. Результат следующий:@ bfa4a3be drees tip | Сделка о 788aa028 drees | Старые вещи
Если вы относительно новичок в них, это
histedit
может быть лучшим выбором, чемchistedit
потому, что он предоставляет описания команд в файле histedit для справки. Просто требуется немного больше редактирования, чтобы установить команды с использованием обычного редактирования текста (как и при обычном перемещении).Обратите внимание, чтобы использовать любого
histedit
илиchistedit
вам нужно добавитьhistedit
к расширениям в файле ~ / .hgrc:Я предложил,
chistedit
потому что он наиболее близокrebase -i
и работает где-либо в истории. Если вы действительно хотите заменить / перенастроить текущую ревизию на предыдущую, тогда @G. Предложение Демекиstrip
может быть хорошим, поскольку то, что происходит, ясно. Он встроен, начиная с Mercuria 2.8. Чтобы получить результаты, аналогичные приведенным выше, вы можете сделать следующее:Обратите внимание
strip
, как и histedit, в вашем ~ / .hgrc необходимо включить:источник
Предположим, вы хотите объединить 2 последних коммита.
Найдите номер редакции
возможный выход:
Ветка с мягким сбросом
Зафиксируйте изменения снова
Ноты
strip
требует включения встроенного расширения. Создайте / отредактируйте~/.hgrc
файл конфигурации со следующим содержанием:источник
Я использую:
источник