Mercurial вишня собирает изменения для коммита - PullRequest
57 голосов
/ 13 мая 2009

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

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

Ответы [ 10 ]

36 голосов
/ 05 октября 2010

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

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

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

enter image description here

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


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

example of change selection in the commit tool

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

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

34 голосов
/ 13 мая 2009

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

  • Расширение записи , которое работает примерно так же, как запись darcs. Распространяется с Mercurial.
  • Расширение полки , которое позволяет вам "отложить" определенные изменения, позволяя вам зафиксировать только подмножество ваших изменений (тех, которые не отложены)
16 голосов
/ 27 декабря 2011

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

Обычная команда "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» в своих путевых именах.

16 голосов
/ 14 мая 2009

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

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

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

Первый пример - сжатие коммитов A, B и C. Первый init 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-creation. Это оставляет историю таким, где A + B + C - это один коммит, представляющий собой комбинацию из трех интересующих нас патчей:

---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 связное исправление в списке рассылки.

7 голосов
/ 18 января 2012

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

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

[extensions]
record=

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

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

5 голосов
/ 07 февраля 2017

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

3 голосов
/ 13 мая 2009

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

2 голосов
/ 08 октября 2010

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

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

2 голосов
/ 25 мая 2009

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

0 голосов
/ 17 апреля 2014

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

hg stat> filelist.txt

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...