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

Самый пугающий момент для новичка на деле прост: разбираем конфликты слияния по шагам.

Конфликт слияния возникает, когда git не может автоматически объединить изменения, потому что обе ветки правили одни и те же строки одного файла.

Почему конфликт — это нормально

Git отлично сливает изменения в разных частях файла автоматически. Но если в ветке main и в ветке feature изменили одну и ту же строку по-разному, git не может решить за вас, какой вариант правильный. Он честно останавливается и просит человека разобраться. Это не поломка, а штатная ситуация.

Как выглядит конфликт

При git merge вы увидите:

Вывод:

Auto-merging config.py
CONFLICT (content): Merge conflict in config.py
Automatic merge failed; fix conflicts and then commit the result.

Команда git status покажет файлы в разделе Unmerged paths. Откройте конфликтный файл — git вставил в него маркеры:

<<<<<<< HEAD
timeout = 30
=======
timeout = 60
>>>>>>> feature

Читаем маркеры

  • <<<<<<< HEAD — начало вашей версии (текущая ветка).
  • ======= — разделитель между двумя версиями.
  • >>>>>>> feature — конец версии из сливаемой ветки.

Разрешаем по шагам

  1. Откройте файл и решите, какой код должен остаться: ваш, чужой или их комбинация.
  2. Удалите все маркеры (<<<, ===, >>>) и оставьте корректный итоговый код.
  3. Добавьте исправленный файл в индекс — этим вы говорите git, что конфликт решён.
  4. Завершите слияние коммитом.
git add config.py
git commit

Для коммита слияния git сам подставит сообщение — обычно его можно просто принять.

Если передумали

Слияние можно прервать и вернуть всё как было до git merge:

git merge --abort

Как реже встречать конфликты

  • Делайте небольшие частые коммиты и чаще подтягивайте изменения из main.
  • Не держите ветки «живыми» неделями — чем дольше ветка, тем сильнее расходится код.
  • Договоритесь в команде, кто за какие части кода отвечает.

Инструменты помогают

Разрешать конфликты руками в маркерах <<< поначалу непривычно. К счастью, редакторы вроде VS Code подсвечивают конфликтные блоки и предлагают кнопки «Принять текущее», «Принять входящее», «Принять оба». Это нагляднее, чем править текст вручную, но суть та же: вы выбираете, какой код останется, а затем добавляете файл в индекс. Есть и встроенная команда git mergetool, открывающая трёхпанельный визуальный сравниватель.

Не бойтесь конфликтов

Новички часто паникуют, увидев слово CONFLICT, и в панике удаляют папку проекта. Этого делать не нужно: конфликт — рутинная и полностью обратимая ситуация. Если запутались, всегда можно нажать «отбой» командой git merge --abort и вернуться к состоянию до слияния, как будто ничего не было. Спокойно разберите конфликт по шагам — и вы убедитесь, что ничего страшного в нём нет.

Итог

  • Конфликт — когда обе ветки правят одну строку; git просит вас выбрать.
  • Уберите маркеры <<</===/>>>, оставьте верный код, git add и git commit.
  • git merge --abort отменяет слияние и возвращает исходное состояние.
Проверьте себя
1. Когда при слиянии возникает конфликт?
AВсегда при любом merge
BКогда обе ветки по-разному изменили одни и те же строки файла
CКогда в репозитории слишком много веток
DКогда забыли настроить user.email
2. Что нужно сделать с маркерами <<<<<<<, ======= и >>>>>>>?
AОставить их — git уберёт сам
BУдалить все маркеры, оставив корректный итоговый код
CЗакоммитить вместе с ними
DСкопировать в .gitignore
3. Как полностью отменить начатое слияние и вернуть исходное состояние?
Agit merge --abort
Bgit commit --abort
Cgit reset --hard origin
Dgit branch -d
Поддержать проект