Разрешить конфликты при слиянии веток
Конфликты слияния возникают, когда git не может автоматически объединить изменения из разных веток. Это происходит, когда в репозитории есть противоречивые изменения, сделанные в одних и тех же местах.
Причины возникновения конфликтов:
- Одновременная работа нескольких людей над одними файлами.
- Обновление локальной копии с сервера (
git pull), когда изменения в удаленном репозитории противоречат вашим локальным правкам. - Слияние веток (
git merge), если в них были сделаны разные изменения в одних и тех же участках кода. - Попытка отправки изменений (
git push) в удаленный репозиторий, если в нем уже есть коммиты, противоречащие вашим локальным правкам.
Типы конфликтов:
- Конфликты изменения строк — наиболее распространенный тип конфликта, который возникает, когда одна и та же строка файла изменена по-разному в разных ветках.
- Конфликты в файловой структуре (tree conflicts) — возникают, когда один пользователь изменяет файл, а другой его удаляет.
Как выглядят конфликты в файлах
Когда git обнаруживает конфликт, он помечает проблемные участки специальными маркерами:
Общая часть текста до конфликта
<<<<<<< HEAD
Изменения в текущей ветке
=======
Изменения во входящей ветке
>>>>>>> branch-name
Где:
<<<<<<< HEAD— начало изменений в текущей ветке.=======— разделитель между версиями.>>>>>>> branch-name— конец изменений из входящей ветки.
Разрешение конфликтов в командной строке
Чтобы разрешить конфликт с помощью командной строки:
-
Определите файлы с конфликтами, выполнив команду:
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
Прерывание слияния
Чтобы отменить слияние и вернуться к состоянию до начала операции, выполните команду:
git merge --abort