Допустим, у меня есть локальный и удаленный репозиторий Mercurial. Теперь я начинаю работать над функцией. Я работаю над этим, и когда я думаю, что это сделано, я фиксирую набор изменений. Попробовав еще немного, я обнаружил, что могу еще больше улучшить эту функцию, изменив что-то в коде. Я вношу изменения и подтверждаю. Спустя 20 минут я обнаружил ошибку в этой новой функции, поэтому исправляю ее и фиксирую ее.
Теперь у меня есть 3 набора изменений, которые я бы действительно хотел отправить в удаленный репозиторий как один набор изменений, например, с сообщением «Реализация функции X».
Как я могу сделать это без особых хлопот? Я считаю, что смогу сделать это с помощью патчей, но это, похоже, требует много работы.
Ответы:
Как насчет расширения "Свернуть" ?
источник
hg rebase --collapse
. Просмотрите hg wiki о команде rebase. Поскольку этот вопрос является третьим общим результатом поиска и первым в stackoverflow, я подумал, что эта информация может быть полезной.hg rebase
with--collapse
в одной ветке.Расширение histedit - это именно то, что вам нужно.
или
откроет список исходящих ревизий. Из списка вы можете
histedit предложит вам новое сообщение фиксации свернутых наборов изменений, которые по умолчанию представляют собой два сообщения с разделением "\ n *** \ n".
Вы также можете получить аналогичные результаты, используя расширение mq, но это намного сложнее.
Вы также можете использовать расширение сворачивания, чтобы просто свернуть, но оно не обеспечивает такой приятный пользовательский интерфейс и не дает возможности редактировать результирующее сообщение фиксации. Редактирование итогового сообщения фиксации также позволяет очистить последнее сообщение, что я всегда использую.
источник
Да, вы можете сделать это с помощью патчей: предположим, что ваша работа находится в наборах изменений от 100 до 110 включительно.
Создайте патч:
% hg export -o mypatch 100:110 --git
Обновление до 99:
% hg update 99
Примените патч с --no-commit (иначе вы вернете все свои изменения):
% hg import --no-commit mypatch
Зафиксируйте все изменения сразу:
% hg commit
Теперь у вас есть две головы (110 и 111), которые должны быть эквивалентны с точки зрения файлов, которые они создают в вашем рабочем каталоге - возможно, различите их для здравомыслия, прежде чем удалять старые:
% hg strip 100
Хорошо, теперь, когда я все это изложил, это действительно кажется длинным, но, проделав это несколько раз, я не считаю это слишком сложной задачей ...
источник
hg strip --keep
и нет, а затем фиксирует все за один коммит?hg strip
резервная копия будет помещена в.hg/strip-backup/
каталог. Думаю, это не так безопасно,git reflog
но все же дает какое-то спасение.Если вы используете TortoiseHg, пользователь может просто выбрать две версии (используйте CTRL для выбора непоследовательных), щелкните правой кнопкой мыши и выберите «Сжать историю» .
После этого вы получите новый список изменений в новом заголовке, начиная с первого изменения, которое вы выбрали ранее, он будет содержать все списки изменений потомков между выбранными вами.
Вы можете просто удалить старые списки изменений, если они вам больше не нужны: используйте для этого расширения MQ . Опять же, в TortoiseHg: щелкните правой кнопкой мыши первый список изменений, который нужно удалить со всеми его потомками, «Изменить историю -> Удалить» .
источник
Я предпочитаю использовать mq для этого сворачивания с помощью TortoiseHg, как описано здесь . Однако это легко сделать из командной строки следующим образом:
(Возможно, есть лучший способ выполнить шаг qfold, но я не знаю об этом, поскольку обычно использую TortoiseHg для этой операции.)
Сначала это кажется немного сложным, но как только вы начнете использовать mq, это будет довольно просто и естественно - плюс вы можете делать с mq множество других вещей, которые могут оказаться очень удобными!
источник
hg collapse
иhg histedit
это лучшие способы. Вернее, было бы лучше всего, если бы они работали надежно ... У меняhistedit
случился сбой с дампом стека в течение трех минут.Collapse
не намного лучше.Думал, что могу поделиться двумя другими BKM:
hg rebase --collapse
Это расширение распространяется с Mercurial. У меня еще не было проблем с этим. Возможно, вам придется поиграть в некоторые игры, чтобы обойти
hg rebase
ограничения - в основном, ему не нравится перебазирование до предка в той же ветке, с именем или по умолчанию, хотя оно позволяет, если перебазирование между (именованными) ветвями.Переместите репозиторий (
foo/.hg
) в рабочий каталог (bar
) и его файлы. А не наоборот.Некоторые люди говорили о создании двух деревьев клонов и копировании файлов между ними. Или исправление между ними. Вместо этого легче перемещать
.hg
каталоги.Это работает до тех пор, пока настоящие репозитории,
.hg
деревья, не зависят от рабочего каталога и его файлов.Если они не независимы ...
источник
histedit
это очень хороший вариант для этой задачи. Я все еще не доверяю ему, так как делаю git rebase -i, но он не дает сбоев ... по крайней мере, более новые версии оставят вас на временной ветке, если что-то пойдет не так, поэтому единственный раз, когда изменения будут удалены после фиксации новой ветки.Я никогда не использовал Mercurial, но это очень похоже на то, о чем не так давно говорил Мартин Фаулер в своем блоге:
http://martinfowler.com/bliki/MercurialSquashCommit.html
источник
Почему не просто
hg strip --keep
командовать?Затем вы можете зафиксировать все изменения как одну фиксацию.
источник
HistEdit будет делать то, что вы хотите, но, вероятно, это излишне. Если единственное, что вам нужно, - это сложить несколько ревизий вместе, Collapse Extension сделает свою работу.
источник
Предположу , у вас есть два неопубликованных
THIS
иTHAT
фиксации в Mercurial и как их присоединиться к одну фиксации вTHIS
точке ::Убедитесь, что ваши коммиты не опубликованы:
Обновление до
LAST
фиксации ::и импорт фиксируется до
THIS
в MQ ::Отмените все исправления и примените только сначала
THIS
:Присоединяйтесь с
THAT
::ПРИМЕЧАНИЕ Чтобы найти имя,
THATNAME
используйте:Примените все патчи и переместите их в историю репозитория:
Мое сообщение в блоге по теме: « Объединение двух коммитов в Mercurial» .
источник
Да,
strip --keep
работает на вопрос автора. Но он немного отличался от других, например, если у вас есть версии с 1 по 30, но вы хотите свернуть только версию 12-15. Другие решения работают, но нетstrip --keep
.источник