Разрешение конфликтов слияния
Самый пугающий момент для новичка на деле прост: разбираем конфликты слияния по шагам.
Конфликт слияния возникает, когда 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— конец версии из сливаемой ветки.
Разрешаем по шагам
- Откройте файл и решите, какой код должен остаться: ваш, чужой или их комбинация.
- Удалите все маркеры (
<<<,===,>>>) и оставьте корректный итоговый код. - Добавьте исправленный файл в индекс — этим вы говорите git, что конфликт решён.
- Завершите слияние коммитом.
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отменяет слияние и возвращает исходное состояние.