git merge conflicts

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.

Синтаксис

git mergetool [OPTIONS] [FILE...] # Открыть все конфликтующие файлы поочерёдно git mergetool # Открыть конкретный файл git mergetool src/main.py # Указать инструмент явно git mergetool --tool=vimdiff # Список доступных инструментов git mergetool --tool-help

Флаги и опции

ФлагОписание
--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 как mergetool
Настройка VS Code как инструмента слияния требует дополнительной конфигурации в .gitconfig:
[merge]
    tool = vscode
[mergetool "vscode"]
    cmd = code --wait $MERGED
После этого git mergetool открывает VS Code с тремя панелями: «Текущие» (ours), «Входящие» (theirs), «Результат». Используйте кнопки «Accept Current / Accept Incoming / Accept Both» для выбора.
Совет: .orig-файлы после mergetool
По умолчанию Git оставляет резервные копии с расширением .orig (например, merge.txt.orig) после работы git mergetool. Чтобы отключить это поведение: git config --global mergetool.keepBackup false. Или добавьте *.orig в .gitignore.
Внимание: git add после mergetool обязателен
После закрытия инструмента разрешения конфликтов файл НЕ добавляется в индекс автоматически. Всегда выполняйте git add <файл> для каждого разрешённого файла, затем git merge --continue. Если пропустить git add — слияние не завершится.