Изменения выбора Mercurial Cherry для фиксации

Скажем, я внес много изменений в свой код, и мне нужно зафиксировать только несколько из этих изменений. Есть ли способ сделать это в ртути? Я знаю, что у darcs есть такая функция.

Я знаю, что hg transplant может делать это между ветвями, но мне нужно что-то подобное для фиксации кода в текущей ветке, а не при добавлении наборов изменений из какой-то другой ветки.


person mansu    schedule 12.05.2009    source источник
comment
Я спросил это недавно как дубликат. Я не знал терминологии, поэтому не нашел ее при поиске. См. Принятый ответ на мой вопрос, который касается hg graft, нового в Mercurial 2.0. stackoverflow.com/ questions / 10288482 /   -  person oob    schedule 25.04.2012


Ответы (10)


MQ, как упомянул Чад, - это один путь. Есть и более легкие решения:

  • Расширение записи, которое работает примерно так же, как запись darcs. Распространяется с ртутью.
  • Расширение полки, которое позволяет «отложить» определенные изменения, позволяя фиксировать только подмножество ваших изменений (тех, которые не отложены)
person Kurt Schelfthout    schedule 13.05.2009
comment
см. дополнительную информацию в этом ответе: stackoverflow.com/a/7768682/411282 - person Joshua Goldberg; 12.03.2017

Если вы используете TortoiseHg 1.x для Windows, эта функция прекрасно реализована прямо из коробки (расширения не требуются).

  1. Запустите инструмент фиксации TortoiseHg.
  2. Выберите файл, для которого вы хотите зафиксировать только часть изменений.
  3. Щелкните вкладку «Выбор фрагмента» на панели предварительного просмотра.
  4. Дважды щелкните или используйте пробел, чтобы переключить блоки изменений, которые должны быть включены в фиксацию.

В TortoiseHg 2.x вкладка «Выбор фрагмента» больше не существует. Его место занимает инструмент "Полка". У него есть несколько дополнительных функций, чем у старого выбора фрагментов. Эти новые функции достигаются за счет некоторой дополнительной сложности.

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

Обратите внимание, что при использовании этой функции нет необходимости явно включать расширение Mercurial Shelve. По словам Стива Борхо (ведущего разработчика TortoiseHg) в , ответ на другой вопрос TortoiseHg: «У нас есть локальная копия расширения полки, и мы вызываем ее напрямую».


В TortoiseHg 2.7+ эта функция была улучшена и повторно представлена. Теперь он встроен непосредственно в инструмент фиксации:

пример выбора изменения в инструменте фиксации

Обратите внимание в списке файлов слева, что верхний файл отмечен, чтобы указать, что он будет включен, второй файл не отмечен, потому что он не будет включен, а третий файл, Sample.txt, заполнен (индикатор флажка Null) потому что только выбранные изменения из этого файла будут включены в фиксацию.

Изменения в Sample.txt, которые будут включены, отмечены в правой нижней части изображения. Изменения, которые будут исключены, не отмечены, а представление различий неактивно. Также обратите внимание, что значок инструмента полки по-прежнему доступен.

person mwolfe02    schedule 05.10.2010
comment
Ага, вот почему я не понял, почему это был вопрос. Это нелегко сделать, если вы не используете TortoiseHg. Я этого не знал. - person Lasse V. Karlsen; 05.10.2010
comment
А что насчет тех из нас, кто использует версию 2? tortoisehg.bitbucket.org/manual/2.0/commit.html не поддерживает есть вкладка выбора фрагментов, которую я вижу. - person alsuren; 12.01.2012
comment
@alsuren и другие: Начиная с TortoiseHg 2.7, был повторно представлен старый рабочий процесс из TortoiseHg 1.x. Подробности см. В обновленном ответе. - person mwolfe02; 18.04.2013
comment
Кто-нибудь видел, что при выборе фрагментов не отображаются фрагменты с файлами, в которых много изменений? Вместо нескольких фрагментов различия между фиксацией и полкой показывают одну большую разницу. Приложения внешних различий отлично показывают отдельные различия. Это начало происходить только в прошлом месяце. - person ventaur; 25.07.2013
comment
Немного возродился, но я заметил, что в THG 3.3 это теперь удалено из фиксации и снова на полке. Кто-нибудь из любопытства знает причину этого? - person fostandy; 07.07.2015
comment
Я только что обновился с THG 3.1.2 до THG 3.4.1, и функция фиксации с выбором фрагмента не изменилась. @fostandy, если вы обновитесь до 3.4.1 (последняя стабильная версия на момент написания), вы видите функциональность в фиксации? Возможно, он был удален и повторно введен где-то между 3.1.2 и 3.4.1, но мне недостаточно любопытно, чтобы запускать несколько старых установок ... - person mwolfe02; 13.07.2015
comment
Смущает - я последний раз проверял (на 3.3) я использовал патчи (mq). Инструмент фиксации действительно работает, как вы сказали (только не в патчах), и, вероятно, работал и в последней версии. - person fostandy; 19.07.2015

Я чувствую, что что-то упускаю, потому что этого еще никто не предлагал.

Обычная команда «hg commit» может использоваться для выборочного выбора того, что нужно зафиксировать (вам не нужно фиксировать все ожидающие изменения в локальном рабочем каталоге).

Если у вас есть набор таких изменений:

M ext-web/docroot/WEB-INF/liferay-display.xml
M ext-web/docroot/WEB-INF/liferay-portlet-ext.xml
M ext-web/docroot/WEB-INF/portlet-ext.xml

Вы можете зафиксировать только два из этих изменений с помощью ...

hg commit -m "partial commit of working dir changes" ext-web/docroot/WEB-INF/liferay-display.xml ext-web/docroot/WEB-INF/liferay-portlet-ext.xml

Не очень удобно из командной строки, потому что вам нужно вручную вводить файлы для выборочной фиксации (в отличие от процесса с флажком GUI, такого как черепаха), но это примерно так же просто, как и получается, и не требует расширений. И подстановка файлов, вероятно, может помочь уменьшить набор текста (как это было выше, оба зафиксированных файла однозначно используют "liferay" в своих именах пути.

person Gary Affonso    schedule 26.12.2011
comment
Многие другие ответы касаются только выбора изменений из каждого файла (хотя неясно, требуется ли это из вопроса, поэтому проголосуйте за) - person Peter Gibson; 09.01.2012

Учебник Mercurial Queues ужасен для этого случая использования. Все примеры, которые я видел, предполагают, что вы еще не совершили фиксацию и обновляете один патч. В большинстве случаев это не так, и у вас есть 2 или 3 коммита, которые вы хотите объединить или изменить каким-либо другим способом.

Допустим, у вас есть такая история:

---O---O---A---B---C

Первый пример - сквош коммитов A, B и C. Первый запуск mq:

$ hg qinit

Теперь нам нужно «импортировать» коммиты A, B и C в очередь исправлений. Предположим, это последние 3 коммита. Мы можем использовать синтаксис ревизии "-N", чтобы импортировать их следующим образом:

$ hg qimport -r -3:-1

Это означает импорт в виде исправлений от 3 исправлений до последней фиксации. Вы можете проверить статус этих исправлений с помощью hg qseries. Должно появиться что-то вроде этого:

$ hg qseries
101.diff
102.diff
103.diff

Где номера 101, 102 и 103 соответствуют номерам локальных ревизий коммитов A, B и C. Теперь эти исправления применены, что означает, что изменения, которые они описывают, уже находятся в рабочей копии. Вы можете избавиться от изменений в рабочей копии и удалить их из истории коммитов, сохранив их только в форме патча, используя hg qpop. Вы можете либо сказать hg qpop; hg qpop, чтобы убрать изменения C и B из стека, либо указать патч, который нужно «вытолкнуть». В этом случае это будет примерно так:

$ hg qpop 101.diff
now at: 101.diff

Теперь у вас есть исправления для коммитов B и C в очереди исправлений, но они не применяются (их изменения были «потеряны» - они существуют только в области очереди исправлений). Теперь вы можете складывать эти патчи в последний, т.е. мы создаем новый коммит, который является эквивалентом суммы изменений A + B + C.

$ hg qfold -e 102.diff 103.diff

Это покажет ваш редактор, чтобы вы могли изменить сообщение фиксации. По умолчанию сообщение представляет собой объединение сообщений фиксации для изменений A, B и C, разделенных звездочками. Приятно то, что hg qfold будет завершать исправления табуляцией, если вы используете bash и у вас есть исходный код сценария hg-completion. Это оставляет историю так, где A + B + C - это один коммит, который представляет собой комбинацию 3 патчей, которые нас интересуют:

---O---O---A+B+C

Другой вариант использования - если у нас такая же история, как и раньше, но мы хотим удалить патч B и объединить A + C. На самом деле это очень похоже на вышеизложенное. Когда вы дойдете до шага qfold, вы просто сбросите последнюю фиксацию, а не последние 2 фиксации:

$ hg qfold -e 103.diff

Это оставляет изменение для B в очереди исправлений, но оно не применяется к рабочей копии, и его фиксация отсутствует в истории. В этом можно убедиться, запустив:

$ hg qunapplied
102.diff

История теперь выглядит так, где A + C - это один коммит, объединяющий изменения A и C:

---O---O---A+C

Последний вариант использования может заключаться в том, что вам нужно применить только фиксацию C. Вы можете сделать это, запустив qimport, как указано выше, и вы удалите все патчи, которые вам не нужны:

$ hg qpop -a

Флаг -a означает удаление всех патчей. Теперь вы можете применить только тот, который вам нужен:

$ hg qpush 103.diff

Это оставляет вам эту историю:

---O---O---C

Как только вы закончите со всем этим, вам нужно закончить возиться с очередью. Это можно сделать с помощью:

$ hg qfinish -a

Итак, вот и мы. Теперь вы можете запустить hg push и зафиксировать только то, что вы хотите, или hg email согласованный патч в список рассылки.

person richq    schedule 13.05.2009

Прошло какое-то время. Кажется, лучший вариант сейчас - hg commit --interactive

person ElyashivLavi    schedule 07.02.2017

Вы можете использовать расширение записи, которое распространяется с Mercurial.

Вам необходимо сначала включить его в вашем ~/.hgrc файле, добавив его в раздел [extensions]:

[extensions]
record=

Затем просто введите hg record вместо hg commit, и вы сможете выбрать, какие изменения в каких файлах вы хотите зафиксировать.

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

person ronnix    schedule 18.01.2012
comment
У crecord есть преимущество перед записью в том, что вы можете выбирать части блока. И интерфейс тоже намного приятнее: D - person Jürgen A. Erhard; 29.06.2012
comment
На странице расширения записи указано: Это расширение устарело, функция теперь является частью ядра Mercurial как hg commit --interactive. См. этот ответ. - person saaj; 15.10.2016

Я считаю, что Mercurial Queues выполняет эту роль для Mercurial. Там есть ссылка на неплохой учебник.

person Chad Birch    schedule 12.05.2009
comment
Кажется, это делает то, что я хочу, однако было бы здорово, если бы процесс был более интерактивным, как команда hg transplant. - person mansu; 13.05.2009

Попробуйте qct (Qt Commit Tool). В нем есть функция «выбора изменений», которая запускает инструмент трехстороннего слияния, чтобы вы могли отменить отдельные изменения. После фиксации те изменения, которые вы «отменили», возвращаются.

person Community    schedule 24.05.2009

Я использую commit-patch. Это скрипт, который позволяет редактировать разницу перед фиксацией. Это действительно хорошо с режимом diff-mode и vc-режимом Emacs.

Раньше я использовал crecord, но в нем есть ошибки, связанные с unicode (на самом деле расширение записи имеет ошибки, от которых зависит crecord).

person jpkotta    schedule 07.10.2010

Сначала вы должны забыть все, что вы когда-либо знали о графическом интерфейсе пользователя, и вернуться в командную строку. Далее из командной строки сделайте следующее:

hg stat> filelist.txt

Это направит все ваши измененные файлы в текстовый файл с именем filelist.txt.

Затем отредактируйте список файлов, включив в него только те файлы, которые вы хотите зафиксировать.

Наконец, выполните фиксацию с использованием набора файлов sytnax:

hg commit "set: 'listfile: test.txt'"

person SSchulte    schedule 17.04.2014