Разрешение конфликтов
↑ 6.1 Git · ← Предыдущая · → Следующая
Зачем это на собесе
Как вы действуете при конфликте слияния и как их избегать.
Объяснение
Конфликт возникает, когда обе ветки изменили одни и те же строки (или один удалил файл, другой изменил).
<<<<<<< HEAD (ваша ветка / целевая при merge)
const limit = 50;
=======
const limit = 100;
>>>>>>> feature/x (входящие изменения)Порядок:
git status— список конфликтующих файлов (both modified).- Понять смысл обеих правок (спросить автора, посмотреть
git log -p,git blame). - Отредактировать файл, убрать маркеры, собрать корректный итог.
git add <file>; затемgit merge --continueилиgit rebase --continue.- Запустить сборку и тесты — конфликты бывают семантическими (код компилируется, но логика нарушена).
- Отмена:
git merge --abort/git rebase --abort.
Инструменты и приёмы:
| Приём | Команда |
|---|---|
| Взять «нашу»/«их» версию целиком | git checkout --ours|--theirs file (при rebase роли меняются местами) |
| Трёхсторонний diff | git config merge.conflictstyle zdiff3 (показывает базу) |
| Визуальный merge-инструмент | IDE (VS Code, WebStorm), git mergetool |
| Переиспользование решений | git config rerere.enabled true (запоминает разрешения) |
Lock-файлы (package-lock.json, pnpm-lock.yaml) | не править руками: принять одну сторону и перегенерировать npm install |
| Сгенерированные файлы | перегенерировать |
Как избегать:
- Короткие ветки, частая синхронизация с
main. - Небольшие PR и ясные границы ответственности (модули, feature-структура).
- Форматтер и линтер в pre-commit: нет «шумных» правок форматирования.
- Не смешивайте рефакторинг и функциональные изменения.
- Договорённости о владении файлами (CODEOWNERS).
Нюансы и подводные камни
- «Взять свою версию всех файлов» стирает чужую работу.
- При rebase
ours/theirsинвертированы (ours — целевая ветка). - Оставшийся маркер
<<<<<<<в коде — частая ошибка: линтер/hook проверяет. - Конфликты в lock-файлах и миграциях требуют пересоздания, а не ручной склейки.
- После разрешения обязательно перепроверяйте поведение.
Практика
- Смоделируйте конфликт в двух ветках и разрешите через
zdiff3. - Включите
rerereи повторите rebase. - Разрешите конфликт в
package-lock.jsonперегенерацией.
Вопросы с ответами
Что делать при конфликте слияния?
Понять обе правки, собрать корректный результат,
git add, продолжить операцию и проверить тестами.
Как уменьшить число конфликтов?
Короткие ветки, частая синхронизация с main, небольшие PR, автоформатирование.