Вопрос

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

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

Это было полезно?

Решение

MQ, как упоминал Чад, - это один из способов.Существуют также более легкие решения:

  • Расширение записи который работает примерно так же, как запись darcs.Он распространяется с помощью mercurial.
  • Расширение стеллажа который позволяет вам "откладывать" определенные изменения, позволяя вам зафиксировать только подмножество ваших изменений (те, которые не отложены).

Другие советы

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

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

Для Черепаха 2.x, вкладка выбора куска теперь исчезла.На его месте находится Инструмент для хранения на полке.У него несколько больше функций, чем у старого hunk selection.Эти новые функции появляются ценой некоторой дополнительной сложности.

enter image description here

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


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

example of change selection in the commit tool

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

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

Руководство по очередям Mercurial ужасно подходит для этого варианта использования.Все примеры, которые я видел, предполагают, что вам еще предстоит совершить коммит и вы обновляете один патч.В большинстве случаев это не так, и у вас есть 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 из стека, или укажите патч для "pop to".В этом случае это было бы что-то вроде этого:

$ 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

Конечным вариантом использования может быть то , что вам нужно применить только commit C.Вы бы сделали это, запустив qimport, как описано выше, и удалили бы все ненужные исправления:

$ hg qpop -a

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

$ hg qpush 103.diff

Это оставляет вас с этой историей:

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

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

$ hg qfinish -a

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

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

Обычная команда "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

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

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

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

[extensions]
record=

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

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

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

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

Попробуйте qct (инструмент фиксации Qt).В нем есть функция "выбрать изменения", которая запускает 3-сторонний инструмент слияния, позволяющий отменить отдельные изменения.После фиксации те изменения, которые вы "отменили", возвращаются.

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

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

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

показатель ртутного столба > filelist.txt

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

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

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

набор " hg commit ":'listfile:test.txt '"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top