Конфликт слияния: как его разобрать

Обновлено 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 и проверка шагов.