Инструменты для слияния

При слиянии файлов Mercurial использует специальные инструменты.

Такой инструмент объединяет две различных версии файла в результирующую. Инструментом слияния является программа, которой передаются два файла и последний общий предок обеих версий, так что она может определить, какие изменения были были сделаны на каких ветках.

Инструменты используются командами "hg resolve", "hg merge", "hg update", "hg backout" и несколькими расширениями.

Обычно, программы слияния пытаются автоматически разрешить конфликты, объединяя непересекающиеся изменения, которые были сделаны в двух различных ветках истории файла. Более того, некоторые интерактивные инструменты слияния облегчают ручное разрешение конфликтов, используя графическое представление или вставляя особые маркеры. Mercurial не поставляется с интерактивными инструментами, полагаясь на внешние программы.

Доступные инструменты слияния

Внешние инструменты слияния и их свойства настраиваются в секции merge-tools конфигурационного файла (см "hg help config"), но как правило можно просто указать имя их исполнимого файла.

Инструмент слияния может использоваться, если его исполняемый файл может быть найден системой, и если он может провести слияние. Исполняемый файл может быть найден, если он доступен по известным путям. Инструмент может провести слияние, если он корректно обрабатывает символические ссылки, в том случае если файл является символической ссылкой, обрабатывает бинарные файлы, если файл является бинарным, и если доступна графическая среда, в случае, если инструмент требует GUI.

Существуют также встроенные инструменты слияния:

"internal:dump"
Создает три версии файла для слияния: локальную, из хранилища и базовую. Эти файлы можно использовать для слияния вручную. Если файл называется "a.txt", то эти файлы будут называться "a.txt.local", "a.txt.other" и "a.txt.base" соответственно и будут находиться в том же каталоге, что и "a.txt".
"internal:fail"
Вместо того, чтобы попытаться провести слияние файлов, измененных на обеих ветках, он помечает их как файлы с неразрешенными конфликтами. После разрешения конфликта должна быть использована команда resolve.
"internal:local"
Использует локальные версии файлов в качестве результата слияния.
"internal:merge"
Использует внутренний неинтерактивный простой алгоритм слияния. Завершиться с ошибкой, если обнаружит конфликт, и оставит специальные маркеры в частично слитом файле.
"internal:other"
Использует версию файла из хранилища в качестве результат слияния.
"internal:prompt"
Спрашивает пользователя, какую версию файла - локальную или из хранилища - использовать в качестве слитой версии.
"internal:tagmerge"
Использует внутренний алгоритм слияния меток (экспериментальный).

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

Выбор инструмента слияния

Mercurial использует следующие правила при выбора программы слияния:

  1. Если инструмент был задан с помощью опции --tool, то используется он. Если это имя инструмента из секции merge-tools, используются настройки оттуда. В противном случае, заданный инструмент должен быть пригодным для запуска командной оболочкой.
  2. Если переменная окружения "HGMERGE" установлена, используется ее значение, оно должно быть исполняемо оболочкой.
  3. Если имя сливаемого файла совпадает с любым шаблоном из секции merge-patterns, используется первый соответствующий шаблону инструмент слияния. При этом не учитываются возможности этого инструмента для слияния двоичных файлов.
  4. Если ui.merge установлен, он рассматривается следующим. Если значение не является именем сконфигурированного инструмента, используется указанное значение, которое должно быть исполнимо командной оболочкой. В противном случае по возможности используется заданный инструмент.
  5. Если в секции merge-tools присутствуют любые подходящие инструменты слияния, используется инструмент с максимальным приоритетом.
  6. Если программа "hgmerge" может быть найдена в системе, она будет использована, но по умолчанию она не будет использоваться для символьных ссылок и бинарных файлов по умолчанию.
  7. Если сливаемый файл не является символьной ссылкой или бинарным файлом, используется "internal:merge".
  8. Слияние завершается неудачей и должно быть завершено с помощью resolve перед фиксацией.

Примечание:

После выбора программы слияния, Mercurial по умолчанию пытается слить файлы, используя простой алгоритм. Инструмент слияния будет запущен, только если это не удастся из-за возникших конфликтов. Решение о том, использовать или нет простой алгоритм слияния может быть проконтролировано настройкой premerge инструмента слияния. По умолчанию оно включено и используется, если сливаемый файл не является бинарным или символьной ссылкой.

Подробнее см. секции merge-tools и ui в "hg help config" или man hgrc.