Mercurial revset выбирая до закладки

Если у меня есть эти наборы изменений в моем хранилище

A --> B --> C --> D
      *

B отмечен закладкой, а D на кончике - как мне создать revset, который будет выбирать все между B и D, но не B.

В частности, я пытаюсь раздавить C и D в B, что-то вроде:

hg strip -r "bookmark:." -k

кроме этой строки также удалит коммит B, который я хочу сохранить.

2 ответа

Решение

Мне не совсем ясно, хотите ли вы раздавить C и D, создав новый коммит C', или же вы хотите раздавить B, C и D, создав новый коммит B', который сохранит исходную закладку.

Для первого:

hg rebase -s 'children(bookmark)' -d bookmark --collapse -m <msg>

Вам нужно указать коммит-сообщение либо с -m или -l вариант, или вы попадете в редактор.

Для второго:

hg rebase -s bookmark -d bookmark^ --collapse -m <msg>

Чтобы в revset указывались все потомки ревизии, за исключением самой ревизии, используйте следующий revset:

children(bookmark)::

Обратите внимание, что нелинейная история в этой точке может привести к неожиданным результатам (в частности, использование children() здесь предполагается только одна дочерняя ревизия).

Не забудьте включить расширение rebase в файле hgrc для этого.

Вы можете использовать histedit расширение для достижения этого. Просто наберите hg histedit c561b4e977df (где c561b4e977df хеш ревизии B в вашем примере). Затем введите fold рядом с ревизиями C и D в появившемся редакторе. Это свернет ревизии C и D в B.

Другие вопросы по тегам