GUI mergetool: VS Code, JetBrains и старая школа
Разрешать конфликты через vim и grep — нормально для маленьких и средних. Но когда у тебя 8 конфликтов в одном файле, или конфликт сложный (три блока изменений рядом, плюс реструктурирование), визуальный 3-way merge tool экономит часы.
В этом уроке мы разбираемся: какие инструменты есть, как они работают концептуально, как настроить git mergetool, и когда стоит юзать GUI vs CLI.
Концепция 3-way merge editor
Хороший GUI mergetool показывает три или четыре панели:
Преимущество перед текстовыми маркерами:
- Видишь все версии одновременно, не нужно переключаться/прокручивать.
- Кнопки “Accept Current Change / Incoming Change / Both” — быстрый выбор стороны.
- Подсветка синтаксиса, intellisense — пишешь финальную версию в нормальном редакторе.
- Иногда видна история коммитов для каждой стороны.
VS Code: встроенный editor
С версии 1.69 (2022) в VS Code встроен полноценный 3-way merge editor. К 2026 году он зрелый и удобный.
Как открыть
- Получи конфликт через
git merge. - Открой проект в VS Code (
code .). - Кликни на конфликтный файл в Source Control панели слева.
- VS Code предложит “Open in Merge Editor” — кликни.
Откроется UI с тремя панелями: Incoming (THEIRS), Current (OURS), Result.
Полезные действия
- Accept Current — взять OURS для блока.
- Accept Incoming — взять THEIRS.
- Accept Both (Combination) — оставить обе версии последовательно.
- Compare with… — diff с любой версией.
После того, как все блоки разрешены, кнопка “Complete Merge” — это эквивалент git add. Сохраняешь, и можно коммитить.
VS Code Merge Editor — лучший дефолтный выбор для начинающих. Бесплатный, кросс-платформенный, не требует отдельной установки. Если уже используешь VS Code как редактор — просто кликай “Open in Merge Editor” при конфликте.
Inline view как альтернатива
Если не хочется открывать Merge Editor, VS Code показывает inline кнопки прямо над маркерами в файле:
Accept Current Change | Accept Incoming Change | Accept Both Changes | Compare Changes
<<<<<<< HEAD
...
=======
...
>>>>>>> feature
Это менее наглядно, но быстрее для простых случаев.
JetBrains IDE (PyCharm, IntelliJ, DataGrip)
JetBrains часто считают лучшим merge editor — особенно для сложных конфликтов в больших файлах.
Возможности
- 3-way panel с продвинутой подсветкой различий.
- Chunk-by-chunk navigation с шорткатами (Alt+Right/Left для перехода между конфликтами).
- Magic wand — Auto-resolve простых блоков, оставляет только реальные конфликты.
- Подсветка whitespace-only различий — можно их игнорировать.
- Интеграция с VCS-историей — кликаешь на блок, видишь “когда и кто этот код добавил”.
Открытие
JetBrains IDE при git merge с конфликтом покажет диалог “Merge Conflicts in N files”. Кнопка “Merge” открывает 3-way editor.
Или из CLI: git mergetool (после настройки).
Настройка как git mergetool
# PyCharm
git config --global merge.tool pycharm
git config --global mergetool.pycharm.cmd '/Applications/PyCharm.app/Contents/MacOS/pycharm merge "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'
# IntelliJ
git config --global merge.tool intellij
git config --global mergetool.intellij.cmd '/Applications/IntelliJ\ IDEA.app/Contents/MacOS/idea merge "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'
Пути зависят от ОС — на Linux/Windows подправь.
Старая школа: meld, kdiff3, p4merge
До эпохи VS Code и JetBrains данная категория была доминирующей.
meld
- Open-source, кросс-платформенный (GTK).
- Простой, надёжный.
- Хорошо для Linux-ориентированных команд.
- Установка:
brew install meld(macOS),apt install meld(Linux).
git config --global merge.tool meld
git config --global mergetool.meld.path /usr/local/bin/meld
git config --global mergetool.meld.useAutoMerge true
kdiff3
- Open-source, исторически один из лучших 3-way merge tools.
- Бывает багги на современных macOS, но на Linux работает отлично.
- Auto-merge простых блоков, удобная навигация.
p4merge
- Бесплатная утилита от Perforce.
- Очень популярна в эпоху до VS Code — простой UI, четыре панели.
- Скачать: perforce.com/downloads/visual-merge-tool.
git config --global merge.tool p4merge
git config --global mergetool.p4merge.path /Applications/p4merge.app/Contents/MacOS/p4merge
vimdiff
Для тех, кто живёт в терминале. Конфликты разрешаются через 4 окна vim с подсветкой.
git config --global merge.tool vimdiff
Не для джунов — кривая обучения вертикальная, плюс в эпоху VS Code это редко оправдано. Знай, что существует, но не начинай с этого.
git mergetool: команда запуска
После настройки merge.tool:
$ git merge feature
CONFLICT (content): Merge conflict in src/etl.py
$ git mergetool
Merging:
src/etl.py
Normal merge conflict for 'src/etl.py':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (vscode):
Git запустит сконфигурированный tool для каждого конфликтного файла по очереди. После того, как ты сохраняешь финальную версию и закрываешь tool, Git помечает файл git add-нутым автоматически.
.orig файлы
По дефолту git mergetool создаёт .orig backup-файлы с не-разрешённой версией. Чтобы убрать:
git config --global mergetool.keepBackup false
Или вычистить разово:
find . -name "*.orig" -delete
Также полезно добавить в .gitignore:
*.orig
Когда GUI лучше, когда CLI
| Сценарий | Выбор |
|---|---|
| 1-2 простых конфликта в файле | CLI: открой в редакторе, поправь руками |
| 5+ конфликтов в одном файле | GUI: 3-way panel экономит когнитивную нагрузку |
| Конфликт в сложном коде (рефакторинг, переезд функций) | GUI: проще видеть структуру |
| Конфликт в YAML/JSON config | CLI: обычно тривиальный |
| Конфликт в lock-файле | НИ ОДИН: регенерируй (см. предыдущий урок) |
| Конфликт в бинарном файле | CLI: --ours/--theirs целиком |
| Конфликт на удалённой сессии (SSH без X11) | CLI: vimdiff или текстовый редактор |
| Параллельно с code review | GUI: видно историю, легче судить контекст |
Не бойся переключаться. Не обязательно “выбрать один инструмент на всю карьеру”. Для простых случаев — текстовый редактор быстрее, для сложных — открываешь GUI. Главное — не геройствовать, экономь голову.
Diff tool ≠ Merge tool
git mergetool — для разрешения конфликтов. Есть похожая команда git difftool — для просмотра обычных diff-ов в GUI:
git config --global diff.tool meld # или vscode, или другое
git difftool HEAD~3 HEAD # diff между двумя коммитами
git difftool --staged # staged changes
git difftool main feature # diff между ветками
Полезно для подготовки к ревью кода или для просмотра изменений в IDE, не выходя в браузер.
Настройка VS Code как mergetool и difftool
# Mergetool
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
# Difftool
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
# Опционально — не спрашивать "точно хочешь mergetool?"
git config --global mergetool.prompt false
git config --global difftool.prompt false
Проверка:
$ git config --list | grep -i 'merge.tool\|mergetool\|diff.tool\|difftool'
merge.tool=vscode
mergetool.vscode.cmd=code --wait --merge $REMOTE $LOCAL $BASE $MERGED
mergetool.prompt=false
diff.tool=vscode
difftool.vscode.cmd=code --wait --diff $LOCAL $REMOTE
Тест:
# Создай конфликт
mkdir test-mergetool && cd test-mergetool
git init
echo "v1" > f.txt && git add . && git commit -m "init"
git switch -c b1
echo "from b1" > f.txt && git commit -am "b1"
git switch -
git switch -c b2
echo "from b2" > f.txt && git commit -am "b2"
git merge b1
# CONFLICT
# Запусти mergetool
git mergetool
# VS Code откроется с merge editor
Несколько mergetool параллельно
В .gitconfig можно описать несколько инструментов и переключаться:
[merge]
tool = vscode
[mergetool "vscode"]
cmd = code --wait --merge $REMOTE $LOCAL $BASE $MERGED
[mergetool "meld"]
path = /usr/local/bin/meld
[diff]
tool = vscode
[difftool "vscode"]
cmd = code --wait --diff $LOCAL $REMOTE
И запускать конкретный:
git mergetool --tool=meld
Удобно: на работе один тул (VS Code), а на личном проекте через SSH — vimdiff.
Альтернатива: разрешать в IDE без git mergetool
В современном workflow многие вообще не используют git mergetool. Сценарий:
- Конфликт случился в терминале (
git mergeилиgit pull). - Открываешь проект в IDE (VS Code/JetBrains).
- IDE сама подсвечивает конфликты, показывает кнопки.
- Разрешаешь в IDE, сохраняешь.
- Возвращаешься в терминал,
git add+git commit.
Это лёгкий путь — никакой настройки mergetool не нужно. IDE уже знает о Git и работает с .git/ напрямую.
Попробуй сам
# Создай конфликт
mkdir mergetool-demo && cd mergetool-demo
git init
cat > app.py <<EOF
def process(data):
return [x.upper() for x in data]
EOF
git add . && git commit -m "init"
git switch -c add-filter
cat > app.py <<EOF
def process(data):
return [x.upper() for x in data if x]
EOF
git commit -am "add: filter empty"
git switch main
git switch -c add-logging
cat > app.py <<EOF
import logging
log = logging.getLogger(__name__)
def process(data):
log.info("processing")
return [x.upper() for x in data]
EOF
git commit -am "add: logging"
git switch main
git merge add-filter # fast-forward
git merge add-logging # CONFLICT
# Вариант 1: открой в VS Code
code .
# Source Control панель -> клик на app.py -> "Open in Merge Editor"
# Вариант 2: настрой mergetool и запусти
git config merge.tool vscode
git config mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
git mergetool
# Финиш
git status
git add app.py
git commit --no-edit
Vim: базовые команды для работы в терминале