Разрешение конфликтов

↑ 6.1 Git · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: middle

Зачем это на собесе

Как вы действуете при конфликте слияния и как их избегать.

Объяснение

Конфликт возникает, когда обе ветки изменили одни и те же строки (или один удалил файл, другой изменил).

<<<<<<< HEAD (ваша ветка / целевая при merge)
const limit = 50;
=======
const limit = 100;
>>>>>>> feature/x (входящие изменения)

Порядок:

  1. git status — список конфликтующих файлов (both modified).
  2. Понять смысл обеих правок (спросить автора, посмотреть git log -p, git blame).
  3. Отредактировать файл, убрать маркеры, собрать корректный итог.
  4. git add <file>; затем git merge --continue или git rebase --continue.
  5. Запустить сборку и тесты — конфликты бывают семантическими (код компилируется, но логика нарушена).
  6. Отмена: git merge --abort / git rebase --abort.

Инструменты и приёмы:

ПриёмКоманда
Взять «нашу»/«их» версию целикомgit checkout --ours|--theirs file (при rebase роли меняются местами)
Трёхсторонний diffgit 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-файлах и миграциях требуют пересоздания, а не ручной склейки.
  • После разрешения обязательно перепроверяйте поведение.

Практика

  1. Смоделируйте конфликт в двух ветках и разрешите через zdiff3.
  2. Включите rerere и повторите rebase.
  3. Разрешите конфликт в package-lock.json перегенерацией.

Вопросы с ответами

Связанные темы