Spec-Zone.ru › Git

git-mergetool

Имя

git-mergetool — запуск средств разрешения конфликтов слияния для устранения конфликтов слияния

Краткое описание

git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…​]

Описание

Используйте git mergetool, чтобы запустить одну из нескольких утилит слияния для устранения конфликтов слияния. Обычно команда запускается после git merge.

Если указаны один или несколько параметров <file>, программа слияния будет запущена для устранения различий в каждом файле (пропуская файлы без конфликтов). При указании каталога будут включены все неразрешённые файлы в этом пути. Если имена <file> не указаны, git mergetool запустит программу слияния для каждого файла с конфликтами слияния.

Параметры

-t <tool>
--tool=<tool>

Используйте программу разрешения слияния, указанную в <tool>. Допустимые значения: emerge, gvimdiff, kdiff3, meld, vimdiff и tortoisemerge. Выполните git mergetool --tool-help, чтобы получить список допустимых значений параметров <tool>.

Если программа разрешения слияния не указана, git mergetool использует переменную конфигурации merge.tool. Если переменная конфигурации merge.tool не задана, git mergetool выберет подходящее значение по умолчанию.

Можно явно указать полный путь к инструменту, задав переменную конфигурации mergetool.<tool>.path. Например, можно настроить абсолютный путь к kdiff3, задав mergetool.kdiff3.path. В противном случае git mergetool предполагает, что инструмент доступен в $PATH.

Вместо запуска одной из известных программ слияния git mergetool можно настроить на запуск альтернативной программы, указав командную строку для её вызова в переменной конфигурации mergetool.<tool>.cmd.

При вызове git mergetool с этим инструментом (через параметр -t или --tool либо переменную конфигурации merge.tool) настроенная командная строка будет вызвана с переменной BASE, содержащей имя временного файла с общей базой для слияния, если она доступна; переменной LOCAL, содержащей имя временного файла с содержимым файла в текущей ветке; переменной REMOTE, содержащей имя временного файла с содержимым объединяемого файла; и переменной MERGED, содержащей имя файла, в который инструмент слияния должен записать результат разрешения конфликта.

Если пользовательский инструмент слияния корректно сообщает об успешном разрешении конфликта своим кодом завершения, переменной конфигурации mergetool.<tool>.trustExitCode можно присвоить значение true. В противном случае git mergetool предложит пользователю подтвердить успешное разрешение после завершения пользовательского инструмента.

--tool-help

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

-y
--no-prompt

Не запрашивать подтверждение перед каждым вызовом программы разрешения слияния. Это поведение используется по умолчанию, если программа разрешения слияния явно указана с помощью параметра --tool или переменной конфигурации merge.tool.

--prompt

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

-g
--gui

Если git-mergetool вызвана с параметром -g или --gui, инструмент слияния по умолчанию будет выбран из настроенной переменной merge.guitool, а не из merge.tool. Если merge.guitool не задана, будет использован инструмент, настроенный в merge.tool. Его можно выбрать автоматически с помощью переменной конфигурации mergetool.guiDefault.

--no-gui

Этот параметр отменяет ранее заданный параметр -g или --gui либо конфигурацию mergetool.guiDefault и считывает инструмент слияния по умолчанию из настроенной переменной merge.tool.

-O<orderfile>

Обрабатывать файлы в порядке, указанном в <orderfile>, где в каждой строке задан один шаблон glob оболочки. Этот параметр переопределяет переменную конфигурации diff.orderFile (см. git-config[1]). Чтобы отменить diff.orderFile, используйте -O/dev/null.

Конфигурация

Всё содержимое этой секции ниже данной строки выборочно включено из документации git-config[1]. Оно совпадает с тем, что приведено там:

mergetool.<tool>.path

Переопределить путь для указанного инструмента. Это полезно, если инструмент не находится в $PATH.

mergetool.<tool>.cmd

Указать команду для вызова указанного инструмента слияния. Указанная команда выполняется в оболочке, где доступны следующие переменные: BASE — имя временного файла с общей базой объединяемых файлов, если она доступна; LOCAL — имя временного файла с содержимым файла в текущей ветке; REMOTE — имя временного файла с содержимым файла из объединяемой ветки; MERGED содержит имя файла, в который инструмент слияния должен записать результат успешного слияния.

mergetool.<tool>.hideResolved

Позволяет переопределить глобальное значение mergetool.hideResolved для конкретного инструмента. Полное описание см. в mergetool.hideResolved.

mergetool.<tool>.trustExitCode

Для пользовательской команды слияния указать, можно ли использовать её код завершения, чтобы определить успешность слияния. Если этому параметру не присвоено значение true, проверяется временная метка целевого файла слияния. Слияние считается успешным, если файл был обновлён; в противном случае пользователю предлагается подтвердить успешность слияния.

mergetool.meld.hasOutput

Старые версии meld не поддерживают параметр --output. Git попытается определить, поддерживает ли meld параметр --output, проверив результат выполнения meld --help. Настройка mergetool.meld.hasOutput позволит Git пропустить эти проверки и использовать заданное значение. Если присвоить mergetool.meld.hasOutput значение true, Git будет безусловно использовать параметр --output, а значение false исключает использование --output.

mergetool.meld.useAutoMerge

Если указан параметр --auto-merge, meld автоматически объединит все части без конфликтов, выделит конфликтующие части и будет ждать решения пользователя. Если присвоить mergetool.meld.useAutoMerge значение true, Git будет безусловно использовать параметр --auto-merge вместе с meld. При значении auto Git определит, поддерживается ли --auto-merge, и будет использовать --auto-merge только при наличии такой поддержки. Значение false полностью исключает использование --auto-merge и является значением по умолчанию.

mergetool.<variant>.layout

Настроить расположение разделённых окон для <variant> vimdiff, которое может быть одним из следующих: vimdiff, nvimdiff, gvimdiff. При запуске git mergetool с --tool=<variant> (или без --tool, если merge.tool настроен как <variant>) Git проверит mergetool.<variant>.layout, чтобы определить расположение окон инструмента. Если конфигурация для конкретного варианта недоступна, в качестве запасного варианта используется значение ' s из vimdiff. Если и оно недоступно, будет использовано расположение по умолчанию с 4 окнами. О настройке расположения см. в разделе BACKEND SPECIFIC HINTS.

mergetool.hideResolved

Во время слияния Git автоматически разрешает максимально возможное количество конфликтов и записывает файл $MERGED, помещая маркеры конфликта вокруг тех конфликтов, которые ему не удалось разрешить; $LOCAL и $REMOTE обычно содержат версии файла до разрешения конфликтов Git. Этот флаг перезаписывает $LOCAL и $REMOTE, чтобы инструменту слияния передавались только неразрешённые конфликты. Можно настроить отдельно для каждого инструмента с помощью переменной конфигурации mergetool.<tool>.hideResolved. По умолчанию установлено значение false.

mergetool.keepBackup

После выполнения слияния исходный файл с маркерами конфликтов можно сохранить в файле с расширением .orig. Если этой переменной присвоено значение false, этот файл не сохраняется. По умолчанию установлено значение true (то есть резервные файлы сохраняются).

mergetool.keepTemporaries

При вызове пользовательского инструмента слияния Git использует набор временных файлов, передаваемых инструменту. Если инструмент возвращает ошибку и этой переменной присвоено значение true, временные файлы сохраняются; в противном случае они удаляются после завершения работы инструмента. По умолчанию установлено значение false.

mergetool.writeToTemp

По умолчанию Git записывает временные версии BASE, LOCAL и REMOTE конфликтующих файлов в рабочем дереве. Если задано значение true, Git попытается использовать для этих файлов временный каталог. По умолчанию установлено значение false.

mergetool.prompt

Запрашивать подтверждение перед каждым вызовом программы разрешения слияния.

mergetool.guiDefault

Задайте true, чтобы по умолчанию использовать merge.guitool (эквивалентно указанию аргумента --gui), или auto, чтобы выбирать merge.guitool или merge.tool в зависимости от наличия значения переменной окружения DISPLAY. По умолчанию установлено значение false; для использования --gui необходимо явно указать аргумент merge.guitool.

Временные файлы

git mergetool создаёт резервные файлы *.orig при разрешении слияний. Их можно безопасно удалить после слияния файла и завершения сеанса git mergetool.

Если присвоить переменной конфигурации mergetool.keepBackup значение false, git mergetool будет автоматически удалять резервные файлы после успешного слияния файлов.

Особенности отдельных серверных модулей

vimdiff

Описание

Если указать --tool=vimdiff в git mergetool, Git откроет Vim с расположением из 4 окон, распределённых следующим образом:

------------------------------------------
|             |           |              |
|   LOCAL     |   BASE    |   REMOTE     |
|             |           |              |
------------------------------------------
|                                        |
|                MERGED                  |
|                                        |
------------------------------------------

LOCAL, BASE и REMOTE — это буферы только для чтения, отображающие содержимое конфликтующего файла в определённых коммитах («коммит, в который выполняется слияние», «коммит общего предка» и «коммит, из которого выполняется слияние» соответственно).

MERGED — доступный для записи буфер, в котором нужно разрешить конфликты (используя остальные буферы только для чтения в качестве справки). Закончив работу, сохраните изменения и выйдите из Vim обычным способом (:wq) или, чтобы отменить операцию, выйдите с помощью :cq.

Настройка расположения

Можно изменить расположение окон Vim, задав переменную конфигурации mergetool.vimdiff.layout, которая принимает строку со следующими разделителями, имеющими специальное значение:

  • + используется для «открытия новой вкладки»

  • , используется для «открытия нового вертикального разделения»

  • / используется для «открытия нового горизонтального разделения»

  • @ обозначает файл, содержащий окончательную версию после разрешения конфликтов. Если он не указан, по умолчанию будет использоваться MERGED.

Приоритет операторов (его можно изменить с помощью скобок) следующий:

`@` > `+` > `/` > `,`

Рассмотрим несколько примеров, чтобы понять, как это работает:

  • layout = "(LOCAL,BASE,REMOTE)/MERGED"

    Это в точности то же расположение по умолчанию, которое мы уже рассмотрели.

    Обратите внимание, что / имеет более высокий приоритет, чем ,, поэтому в данном случае скобки не нужны. Следующее определение расположения эквивалентно:

    layout = "LOCAL,BASE,REMOTE / MERGED"
  • layout = "LOCAL,MERGED,REMOTE"

    Если по какой-либо причине нас не интересует буфер BASE.

    ------------------------------------------
    |             |           |              |
    |             |           |              |
    |   LOCAL     |   MERGED  |   REMOTE     |
    |             |           |              |
    |             |           |              |
    ------------------------------------------
  • layout = "MERGED"

    Будет показан только буфер MERGED. Однако обратите внимание, что все остальные буферы по-прежнему загружены в vim, и к ним можно обратиться командой «buffers».

    ------------------------------------------
    |                                        |
    |                                        |
    |                 MERGED                 |
    |                                        |
    |                                        |
    ------------------------------------------
  • layout = "@LOCAL,REMOTE"

    Если в расположении отсутствует MERGED, необходимо «пометить» один из буферов символом @ (@). Он станет буфером, который нужно редактировать и сохранять после разрешения конфликтов.

    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     LOCAL         |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE"

    Откроются три вкладки: первая будет копией расположения по умолчанию, а в остальных двух будут показаны только различия между (BASE и LOCAL) и (BASE и REMOTE) соответственно.

    ------------------------------------------
    | <TAB #1> |  TAB #2  |  TAB #3  |       |
    ------------------------------------------
    |             |           |              |
    |   LOCAL     |   BASE    |   REMOTE     |
    |             |           |              |
    ------------------------------------------
    |                                        |
    |                MERGED                  |
    |                                        |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  | <TAB #2> |  TAB #3  |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    LOCAL           |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
    ------------------------------------------
    |  TAB #1  |  TAB #2  | <TAB #3> |       |
    ------------------------------------------
    |                   |                    |
    |                   |                    |
    |                   |                    |
    |     BASE          |    REMOTE          |
    |                   |                    |
    |                   |                    |
    |                   |                    |
    ------------------------------------------
  • layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE + (LOCAL/BASE/REMOTE),MERGED"

    Как и в предыдущем примере, но добавляется четвёртая вкладка с той же информацией, что и на первой, но с другим расположением.

    ---------------------------------------------
    |  TAB #1  |  TAB #2  |  TAB #3  | <TAB #4> |
    ---------------------------------------------
    |       LOCAL         |                     |
    |---------------------|                     |
    |       BASE          |        MERGED       |
    |---------------------|                     |
    |       REMOTE        |                     |
    ---------------------------------------------

    Обратите внимание: в определении третьей вкладки необходимо использовать скобки, чтобы , имел более высокий приоритет, чем /.

Варианты

Вместо --tool=vimdiff можно использовать один из следующих вариантов:

  • --tool=gvimdiff, чтобы открыть gVim вместо Vim.

  • --tool=nvimdiff, чтобы открыть Neovim вместо Vim.

При использовании этих вариантов для указания пользовательского расположения нужно задать переменные конфигурации mergetool.gvimdiff.layout и mergetool.nvimdiff.layout вместо mergetool.vimdiff.layout (хотя последнее будет использоваться как запасной вариант, если настройка для конкретного варианта не задана).

Кроме того, для обратной совместимости с предыдущими версиями Git к 1, 2 или 3 можно добавить vimdiff или любой из вариантов (например, vimdiff3, nvimdiff1 и т. д.), чтобы использовать предопределённое расположение. Иными словами, использование --tool=[g|n]vimdiff<x> эквивалентно использованию --tool=[g|n]vimdiff и заданию переменной конфигурации mergetool.[g|n]vimdiff.layout значения…

  • <x>=1: "@LOCAL, REMOTE"

  • <x>=2: "LOCAL, MERGED, REMOTE"

  • <x>=3: "MERGED"

Пример: использование --tool=gvimdiff2 откроет gvim с тремя столбцами (LOCAL, MERGED и REMOTE).

mergetool

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-mergetool

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API