git mergetool
Запуск внешнего инструмента для разрешения merge-конфликтов в интерактивном режиме
Описание
git mergetool — команда, которая запускает внешний графический или текстовый инструмент для разрешения конфликтов слияния. Когда git merge останавливается с конфликтом, git mergetool открывает каждый конфликтующий файл в настроенном инструменте, позволяя интерактивно выбрать нужный вариант из «нашей» (ours) и «их» (theirs) версии.
Инструмент работает только при наличии активного merge-конфликта (после git merge, git rebase или git cherry-pick, завершившихся конфликтом). После разрешения всех конфликтов нужно выполнить git add и git merge --continue.
В уроке 28 git mergetool описывается как один из четырёх способов разрешить merge-конфликт, наряду с ручным редактированием, инструментами IDE и командами git log --merge / git diff.
Синтаксис
Флаги и опции
| Флаг | Описание |
|---|---|
--tool=<tool> | Выбрать инструмент для этого вызова: vimdiff, kdiff3, meld, vscode, emerge, opendiff и другие. Переопределяет глобальную настройку |
--tool-help | Показать список инструментов, доступных в данной системе, и выйти |
-y, --no-prompt | Не спрашивать подтверждение перед открытием каждого файла (запустить всё автоматически) |
--prompt | Спрашивать подтверждение перед открытием каждого файла (поведение по умолчанию) |
-g, --gui | Использовать инструмент из настройки merge.guitool вместо merge.tool |
--no-gui | Принудительно использовать merge.tool, игнорируя merge.guitool |
-O <orderfile> | Обрабатывать файлы в порядке, заданном orderfile (один паттерн на строку) |
Паттерны использования
Из урока 28: полный цикл разрешения конфликта
# 1. Слияние с конфликтом git merge new_branch_to_merge_later # CONFLICT (content): Merge conflict in merge.txt # Automatic merge failed; fix conflicts and then commit the result. # 2. Посмотреть конфликтующие файлы git status # 3. Открыть инструмент разрешения git mergetool # 4. После разрешения — добавить в индекс git add merge.txt # 5. Завершить слияние git merge --continue
Настройка инструмента по умолчанию
# Установить vimdiff как инструмент по умолчанию git config --global merge.tool vimdiff # Установить meld (графический, Linux) git config --global merge.tool meld # Установить VS Code (см. callout ниже) git config --global merge.tool vscode # Проверить настройку git config --global merge.tool
Диагностика конфликта перед mergetool
# Показать коммиты, которые привели к конфликту git log --merge # Показать различия между версиями git diff # Что именно конфликтует git status # both modified: merge.txt # Посмотреть маркеры конфликта в файле cat merge.txt # <<<<<<< HEAD # our version of the line # ======= # their version of the line # >>>>>>> new_branch_to_merge_later
Запуск без подтверждений
# Открыть все конфликтующие файлы без вопросов git mergetool -y # Открыть конкретный файл через vimdiff git mergetool --tool=vimdiff -y src/config.py # Проверить список доступных инструментов git mergetool --tool-help
Советы и предупреждения
Настройка VS Code как инструмента слияния требует дополнительной конфигурации в
.gitconfig:
[merge]
tool = vscode
[mergetool "vscode"]
cmd = code --wait $MERGED
После этого git mergetool открывает VS Code с тремя панелями: «Текущие» (ours), «Входящие» (theirs), «Результат». Используйте кнопки «Accept Current / Accept Incoming / Accept Both» для выбора.
По умолчанию Git оставляет резервные копии с расширением
.orig (например, merge.txt.orig) после работы git mergetool. Чтобы отключить это поведение: git config --global mergetool.keepBackup false. Или добавьте *.orig в .gitignore.
После закрытия инструмента разрешения конфликтов файл НЕ добавляется в индекс автоматически. Всегда выполняйте
git add <файл> для каждого разрешённого файла, затем git merge --continue. Если пропустить git add — слияние не завершится.