#Что означает ошибка
merge conflict
«Automatic merge failed; fix conflicts and then commit the result» — Git не смог объединить изменения, потому что обе ветки правили одни и те же строки. Это нормальная ситуация, не авария, и решается вручную.
git status покажет файлы в состоянии both modified: в них нужно выбрать нужный вариант.
Если вы не готовы разбираться, слияние можно безопасно отменить командой git merge --abort.
Откройте файлы с маркерами конфликта, выберите нужный код и выполните commit.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Конфликт правокОдин участок. | Проявляется как «merge conflict» или близкий по смыслу сбой. | Разрешите. |
| Устаревшая веткаРасхождение. | Проявляется как «merge conflict» или близкий по смыслу сбой. | Rebase. |
| АвтослияниеФайл. | Проявляется как «merge conflict» или близкий по смыслу сбой. | Вручную. |
| Бинарный файлКонфликт. | Проявляется как «merge conflict» или близкий по смыслу сбой. | Выберите версию. |
#Пошаговое решение
- Посмотрите список файловВ терминале того репозитория, где вы запускали merge/pull, выполните
git statusиgit diff --name-only --diff-filter=U. Git покажет файлы с неразрешёнными конфликтами; перед редактированием сохраните свои незакоммиченные изменения и копию критичных файлов. Если Git показываетYou are in the middle of a merge, это активное слияние; при состоянии rebase или cherry-pick порядок завершения иной. Не запускайте следующийgit pull, пока конфликт не разобран. - Откройте файлы и найдите маркерыОткройте один конфликтующий файл в VS Code через панель «Проводник» либо щёлкните по файлу в панели «Контроль версий». В обычном тексте найдите блоки
<<<<<<<,=======,>>>>>>>: по сторонам стоят две версии фрагмента. Убедитесь, что понимаете назначение обеих; для двоичных файлов текстовых маркеров не будет, решение о нужной версии принимают отдельно. В графическом редакторе могут быть кнопки «Принять текущее», «Принять входящее», «Принять оба» — проверяйте содержимое, а не кликайте случайно. - Выберите нужный код и удалите маркерыСравните конфликтующий фрагмент с задачей проекта и аккуратно сформируйте итоговый код, сохраняя нужные изменения обеих веток. Удалите только технические маркеры после разрешения соответствующего конфликта. Для файлов кода проверьте синтаксис, импорты и отсутствие повторяющихся определений; в VS Code сохраните Ctrl+S. Если не уверены в выборе, попросите автора изменения разъяснить назначение участка; автоматический выбор «ours» или «theirs» может потерять изменения.
- Добавьте файлы в индексПосле разрешения всех конфликтов выполните
git status: файлы не должны оставаться в состоянииboth modified. Добавьте проверенные пути по одному:git add путь/к/файлу, заменив путь фактическим; используйтеgit diff --cachedиgit diff --checkдля проверки подготовленного содержимого. Не выполняйтеgit add .вслепую, чтобы не включить секреты, временные файлы или посторонние изменения. Запустите тесты проекта перед созданием итогового коммита. - Завершите слияниеЕсли был именно
git merge, после проверки выполнитеgit commitи сохраните сообщение слияния; еслиgit statusпредлагаетgit merge --continue, допускается эта команда. Дляrebaseиспользуйтеgit rebase --continue, а дляcherry-pick—git cherry-pick --continue; их нельзя смешивать. При необходимости отказаться от текущего незавершённого слияния используйтеgit merge --abortпосле оценки незакоммиченных изменений. Успех —git statusбез незавершённых конфликтов и успешный запуск тестов.
#Как разрешить конфликт
Откройте файл: Git расставляет маркеры <<<<<<< HEAD, =======, >>>>>>> ветка. Между первым и вторым — ваш вариант, между вторым и третьим — чужой. Оставьте нужный код (или объедините), удалите маркеры. Затем git add файл, после того как разрешены все файлы — git commit (сообщение по умолчанию подойдёт). Для удобства используйте git mergetool или встроенные редакторы VS Code («Accept Current / Incoming / Both»).
#Быстрый выбор стороны
Взять версию целиком: git checkout --ours файл (ваша ветка) или git checkout --theirs файл (входящая), затем git add файл. Для всего слияния сразу: git merge -X ours ветка или -X theirs, но проверьте результат — выбираются только спорные участки.
#Отмена и повтор
Отменяйте только незавершённое слияние командой git merge --abort после проверки git status. После уже созданного коммита не используйте вслепую git reset --hard ORIG_HEAD: он может безвозвратно убрать локальные изменения и повлиять на общую историю. Сначала выясните, опубликован ли коммит, и выберите согласованную процедуру git revert либо восстановление на отдельной ветке. Для rebase используется git rebase --abort, а продолжение — git rebase --continue.
#Профилактика
Делайте небольшие коммиты, часто синхронизируйтесь, не форматируйте целые файлы без необходимости (это порождает конфликты), договаривайтесь о зонах ответственности. Бинарные файлы не сливаются автоматически: выбирайте версию через --ours/--theirs. Справка: .
git statusgit diff --name-only --diff-filter=U# После ручного исправления каждого файла:git add ПУТЬ_К_ИСПРАВЛЕННОМУ_ФАЙЛУgit diff --cachedgit diff --check# Только если статус говорит о незавершённом MERGE:git merge --continue