Конфликты при слиянии веток
О конфликтах
Конфликты возникают при слиянии веток, где имеются конкурирующие фиксации в файлах. Git не понимает какие изменения следует включать в окончательное слияние, поэтому конфликты решаются вручную исполнителем задачи. До решения конфликта кнопка Merge pull reguest недоступна.
Причины появления конфликтов:
-
Исполнитель перешел в ветку, в которой были опубликованы новые изменения, не подтянул изменения командой
git pull(см. подраздел Правка инструкции по другому проекту в новой ветке), внес изменения в файле и опубликовал. -
Двое исполнителей, работая в одной или двух разных ветках, вносят разные изменения в одну строку одного файла.
Если исполнители будут работать в одной ветке, но в разных строках файлов, и подтягивать изменения друг друга командой
git pullперед окончательной публикацией (см. подраздел Правка инструкции с другим исполнителем в одной ветке), то конфликтов не возникнет.
- Один исполнитель редактирует файл, а другой — удаляет этот же файл.
Мониторинг конфликтов
Отследить конфликт проще всего в VS Code с помощью вкладки Source Control Graph. Если на графе отображается больше двух ответвлений от первой линии, то при слиянии возникнет конфликт.

К примеру, на рис. выше отмечен момент создания конфликта (1), момент решения конфликта (2) и слияния с веткой main (3).
Решение конфликтов слияния
Первый способ: если конфликт слияния вызван конкурирующими изменениями строк, например при внесении разных изменений в одну строку одного файла в разных ветках репозитория Git, то его решают на GitHub с помощью редактора конфликтов.
-
Перейдите в раздел Pull requests на GitHub (см. шаг 3 подраздела Запрос на слияние веток (merge pull request)).
Откроется страница с уведомлением о конфликте.

-
Нажмите кнопку Resolve conflicts.
Откроется редактор конфликтов.

Для данного файла в ветке main строке 6 было выполнено одно изменение, а в ветке test_vetka2 строке 12 — другое. Поэтому срока 6 выделена жирным.
-
Просмотрите изменения между строкой 1 и 13.
-
Выделите ненужные строки и удалите их, например, с 7-13.
Или удаляются выборочные предложения между блоками, скобочки <<<<<<< >>>>>>> и значки =======.

-
Нажмите кнопку Mark as resolved.
Если конфликт устранен, то напротив файла отобразится зеленная галочка.

-
Нажмите кнопку Commit merge.
Откроется cтраница слияния веток.

-
Выполните шаги 3-4 подраздела Запрос на слияние веток (merge pull request).
Второй способ: остальные типы конфликтов слияния решают в локальном репозитории с помощью VS Code и отправляют изменения в ветку на GitHub.
Применим в компаниях, где над проектом работает много Исполнителей.
-
Откройте проект в приложении VS Code.
-
Откройте конфликтный файл. Помечается в проекте восклицательным знаком.

Конфликтная часть находится между скобочками <<<<<<< >>>>>>>. В зеленом блоке отображаются изменения из ветки test_vetka2, которая является текущей веткой репозитория. В синем блоке отображаются изменения из ветки main, т.е. ветка в которую сливаются изменения из ветки test_vetka2.
Конкурирующие изменения в строках подчеркнуты красным цветом в зеленом и синем блоке.

-
Выберите изменения между зеленым и синим блоком, либо объедините их любым удобным способом, скобочки <<<<<<< >>>>>>> и значки ======= уберите.
Если на данном шаге не будут выбраны нужные изменения, то при нажатии на кнопку Resolve in Merge Editor в редакторе слияния автоматически отобразятся изменения только из зеленого блока.
-
Нажмите кнопку Resolve in Merge Editor.
Откроется Merging: file.md или редактор слияния. В блоке Result отобразится предварительный просмотр решения конфликта.

-
Проверьте блок Result, внесите окончательные правки перед слиянием.
-
Нажмите кнопку Complete Merge.
Откроется модальное окно подтверждения слияния.
-
Нажмите кнопку Complete with Conflicts.
Закроется Merging: file.md, в файле file. md отобразятся принятые изменения.

-
Перейдите в приложение Git Bash и выполните последовательно команды:
8.1.
git add ..8.2.
git commit -m "merge branch".8.3.
git push -u origin test_vetka2. -
Выполните заново все шаги подраздела Запрос на принятие изменений (pull request) и Запрос на слияние веток (merge pull request).
Третий способ: универсальный алгоритм решения конфликтов.
-
Перейдите в ветку main.
-
Загрузите новые изменения с помощью команды
git pull. -
Вернитесь в свою ветку.
-
Выполните команду
git merge mainи разрешите конфликт локально (см. шаг 2 второго способа решения конфликтов).Создастся локальный коммит слияния.
-
Выполните шаги 8-9 второго способа решения конфликтов.