Конфликт слияния: как его разобрать
Обновлено 31 июля 2026 г.
Конфликт слияния возникает, когда две ветки по-разному изменили одну и ту же строку, и git не берётся решить за тебя, чей вариант верный.
Пока правки не пересекаются, git складывает их молча: разные файлы, разные места одного файла - всё соберётся само. Спорным становится только тот кусок, который трогали дважды. Выглядит остановка так:
$ git merge feature-x
Auto-merging report.txt
CONFLICT (content): Merge conflict in report.txt
Automatic merge failed; fix conflicts and then commit the result.Слияние встало на полпути. Что именно не сошлось, показывает git status:
$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: report.txtМаркеры в файле
Git вписал в файл оба варианта и развёл их тремя строками-маркерами:
Title
<<<<<<< HEAD
contact: help@example.com
=======
contact: team@example.com
>>>>>>> feature-x
endМежду <<<<<<< HEAD и ======= лежит версия ветки, на которой ты стоишь. Между ======= и >>>>>>> feature-x - версия ветки, которую вливаешь. Остальные строки файла не тронуты.
Порядок разрешения
Открой файл в редакторе и приведи спорное место к тому виду, каким оно должно быть после слияния. Выбери один из вариантов, или напиши третий, и удали все три строки с маркерами:
Title
contact: team@example.com
endДальше скажи git, что вопрос закрыт, и заверши слияние:
$ git add report.txt # пометить конфликт разрешённым
$ git status
On branch main
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
$ git commit
[main 2a2aa47] Merge branch 'feature-x'Файлов в конфликте может быть несколько. Тогда пройди по каждому из списка Unmerged paths и только потом коммить.
Если посреди разбирательства стало непонятно, что происходит, выход есть всегда:
$ git merge --abort # отменить слияние целикомРепозиторий вернётся ровно в то состояние, в котором был до git merge: маркеры из файлов пропадут, обе ветки останутся на прежних коммитах. Ничья работа не теряется.
Частые ошибки
Забытый маркер. git add не проверяет содержимое, так что строку ======= можно закоммитить вместе с текстом. Перечитай файл глазами перед git add, а лучше загляни в git diff --staged.
git add без правки файла. Команда помечает конфликт разрешённым, но не разрешает его. Сначала редактор, потом git add.
Конфликт - это не поломка репозитория. Он значит, что одну строку правили в двух местах, и git спрашивает, что оставить, вместо того чтобы молча выбросить чужую работу.
Где это в учебнике
Глава 5. Ветки: параллельные версии проекта разбирает конфликт целиком, от строки CONFLICT до завершающего коммита.
Потренироваться руками - в Песочнице: настоящий терминал с git и проверка шагов.