Конфликты слияния возникают, когда git не может автоматически объединить изменения из разных веток. Это происходит, когда в репозитории есть противоречивые изменения, сделанные в одних и тех же местах.
Причины возникновения конфликтов:
Одновременная работа нескольких людей над одними файлами.
Обновление локальной копии с сервера (git pull), когда изменения в удаленном репозитории противоречат вашим локальным правкам.
Слияние веток (git merge), если в них были сделаны разные изменения в одних и тех же участках кода.
Попытка отправки изменений (git push) в удаленный репозиторий, если в нем уже есть коммиты, противоречащие вашим локальным правкам.
Типы конфликтов:
Конфликты изменения строк — наиболее распространенный тип конфликта, который возникает, когда одна и та же строка файла изменена по-разному в разных ветках.
На вкладке Домой в секции Ваша мастерская перейдите в раздел Репозитории.
Выберите репозиторий.
На странице репозитория в разделе Код перейдите в секцию Предложения изменений.
Выберите предложение изменений и в правом верхнем углу нажмите Принять.
На странице предложения изменений изучите сообщение о конфликтах, например:
Объединение заблокировано
...
В этой ветке есть конфликты, которые нужно разрешить
filename.js
CONFLICT (content): Automatic merge failed to resolve conflict in filename.js; Manual content merge required
Нажмите Разрешить в интерфейсе.
Откроется интерфейс редактирования кода, где будут помечены проблемные участки специальными маркерами:
1 ...
2 Общая часть текста до конфликта
3 ...
[Принять текущее] [Принять входящее] [Принять оба изменения]
4 <<<<<<< main
5 Изменения в текущей ветке
6 =======
7 Изменения во входящей ветке
8 >>>>>>> feature-branch
9 ...
10 Общая часть текста после конфликта
11 ...
Где:
Принять текущее, Принять входящее, Принять оба изменения — кнопки для разрешения отдельного конфликта.
<<<<<<< main — начало изменений в текущей ветке.
======= — разделитель между версиями.
>>>>>>> feature-branch — конец изменений из входящей ветки.
Разрешите конфликты:
Чтобы разрешить отдельный конфликт, нажмите возле проблемного участка:
Принять текущее — принять изменения из текущей ветки.
Принять входящее — принять изменения из входящей ветки.
Принять оба изменения — принять изменения из обеих веток.
Чтобы разрешить все конфликты, справа вверху нажмите:
Принять текущий — принять все изменения из текущей ветки.
Принять входящий — принять все изменения из входящей ветки.
Важно
В этом случае будут приняты все изменения, даже если перед этим вы иначе разрешали отдельные конфликты.
Нажмите Пометить решенным и Сохранить изменения.
Определите файлы с конфликтами, выполнив команду:
git status
Файлы с конфликтами отобразятся с пометкой both modified.
Откройте файл с конфликтом в текстовом редакторе.
Найдите маркеры конфликта (<<<<<<<, =======, >>>>>>>).
Выберите вариант решения конфликта:
Удалите ненужную версию.
Создайте новый код, объединяющий обе версии.
После внесения изменений удалите все маркеры конфликта.
Сохраните файл.
Добавьте измененный файл в индекс:
git add <имя_файла>
Завершите слияние:
git commit -m "Resolve merge conflict"
Опубликуйте изменения:
git push
Конфликты в файловой структуре (tree conflicts)
Чтобы разрешить конфликт, когда файл был изменен в одной ветке и удален в другой:
Посмотрите статус конфликта:
git status
Выберите дальнейшее действие с файлом:
Чтобы оставить файл, выполните команду:
git add <имя_файла>
Чтобы удалить файл, выполните команду:
git rm <имя_файла>
Завершите слияние:
git commit -m "Resolve file deletion conflict"
Использование инструментов слияния
Для удобного разрешения конфликтов можно использовать графические инструменты.
Чтобы запустить настроенный инструмент слияния, например VS Code, Sublime Merge или другие, выполните команду:
git mergetool
Прерывание слияния
Чтобы отменить слияние и вернуться к состоянию до начала операции, выполните команду: