Как решить конфликт в Git
В файлах с конфликтом Git записал оба варианта и окружил их метками:
<<<<<<< HEAD
ваш вариант (текущая ветка)
=======
вариант другой ветки
>>>>>>> featureПорядок действий:
- Посмотрите, в каких файлах конфликт:
git status, раздел Unmerged paths, пометкаboth modified. - Откройте каждый такой файл и найдите метки
<<<<<<<,=======,>>>>>>>. - Оставьте нужный текст — один вариант, оба или новый — и удалите все три строки-метки.
- Сохраните файл и отметьте конфликт решённым:
git add файл. - Когда решены все файлы, завершите операцию — как, зависит от команды, на которой случился конфликт.
| Конфликт возник при | Как завершить | Как отменить всё |
|---|---|---|
git merge или git pull | git commit | git merge --abort |
git rebase | git rebase --continue | git rebase --abort |
git stash pop | ничего не нужно, но отложенное осталось в списке — удалите его git stash drop | git reset --merge |
Готовое сообщение коммита слияния откроется в редакторе — сохраните и закройте его. После git pull не забудьте git push.
Проверьте, что меток не осталось: git diff --check до git add и git diff --staged --check после него выводят строки с забытыми метками. Коммит с <<<<<<< в коде — сломанная программа в истории.
Взять файл целиком с одной стороны
Выполните одну из первых двух команд — какую сторону оставить, — затем git add:
git checkout --ours config.json
git checkout --theirs config.json
git add config.json--ours — версия текущей ветки, --theirs — сливаемой. При rebase наоборот: --ours — ветка, на которую переносите, --theirs — ваши коммиты. Это удобно для файлов, которые не правят руками: например, двоичных или созданных программой.
В редакторе
Visual Studio Code и другие редакторы кода подсвечивают конфликт и дают кнопки «Accept Current Change», «Accept Incoming Change», «Accept Both Changes». Кнопка лишь правит файл — git add и завершение операции всё равно за вами.
Подводные камни
- Конфликт «удалено — изменено» (
deleted by them,deleted by us): одна ветка удалила файл, другая его меняла. Оставить файл —git add файл, удалить —git rm файл. - Двоичные файлы (картинки, документы) метками не размечаются — выберите целиком одну версию, как выше.
- Много конфликтов при rebase, один за другим? Отмените (
git rebase --abort) и обновите ветку слиянием:git merge main— конфликты придётся решить только один раз.
Подробно, с примером и разбором меток, — в уроке Конфликты слияния.