Merge conflict — это ситуация когда Git не может автоматически объединить изменения из двух веток, потому что оба разработчика изменили одно и то же место в одном файле.
Почему возникает конфликт
main: ... строка A ... → ... строка A исправлена Иваном ...
feature: ... строка A ... → ... строка A исправлена Марией ...
Git не знает чью версию строки A оставить — вашу или из main. Он останавливается и просит человека принять решение.
Конфликт — это нормально. Он возникает у всех разработчиков. Это не ошибка Git и не чья-то вина — просто два человека работали над одним местом кода одновременно.
Когда возникает конфликт
- При
git merge(слиянии веток) - При
git pull(если удалённая ветка изменилась) - При обновлении ветки от main
- При создании PR (GitHub покажет предупреждение)
Как выглядит конфликт
После неудачного merge Git помечает конфликтные места прямо в файле:
<<<<<<< HEAD (или название вашей ветки)
Ваши изменения
=======
Изменения из другой ветки (main)
>>>>>>> main
Разбираем маркеры:
<<<<<<< HEAD
| Анна Морозова | @anna-morozova | Москва | ← ВАША версия
=======
| Сергей Павлов | @sergey-pavlov | Питер | ← версия из main
>>>>>>> main
Всё что между <<<<<<< и ======= — ваши изменения.
Всё что между ======= и >>>>>>> — изменения из другой ветки.
Разрешение в GitHub Desktop
GitHub Desktop обнаруживает конфликт автоматически и показывает предупреждение.
Шаг 1: Увидели предупреждение
GitHub Desktop показывает:
⚠️ «There are merge conflicts» + список конфликтных файлов
Шаг 2: Откройте файл в редакторе
Нажмите Open in Editor или откройте файл вручную.
Шаг 3: Найдите маркеры и разрешите
Вам нужно:
1. Выбрать нужный контент (вашу версию, чужую, или обе)
2. Удалить ВСЕ три маркера: <<<<<<<, =======, >>>>>>>
3. Сохранить файл
Шаг 4: Сделайте коммит
Вернитесь в GitHub Desktop — конфликтный файл теперь в Changes.
Напишите commit message: fix: разрешён конфликт в contributors.md
Нажмите Commit.
Разрешение в VS Code
VS Code показывает конфликты с кнопками прямо в редакторе:
- Accept Current Change — оставить вашу версию
- Accept Incoming Change — оставить версию из другой ветки
- Accept Both Changes — оставить обе версии (одну за другой)
- Compare Changes — показать различия рядом
Нажмите нужную кнопку — VS Code сам уберёт маркеры.
Три варианта разрешения
1. Оставить вашу версию
<<<<<<< HEAD
Ваша версия строки
=======
Чужая версия строки
>>>>>>> main
Удалите всё кроме вашей версии:
Ваша версия строки
2. Оставить чужую версию
Чужая версия строки
3. Оставить обе
Это самый частый случай в contributors.md:
<<<<<<< HEAD
| Студент | @student | Казань |
=======
| Дмитрий | @dmitry | Байкал |
>>>>>>> main
Нужно сохранить обе строки:
| Дмитрий | @dmitry | Байкал |
| Студент | @student | Казань |
4. Написать новую версию
Иногда нужно объединить оба изменения или написать третий вариант:
<<<<<<< HEAD
function getUserName(user) {
return user.name;
}
=======
function getUserName(user) {
return user.firstName + " " + user.lastName;
}
>>>>>>> main
Разрешение: объединить оба улучшения:
function getUserName(user) {
return user.firstName + " " + user.lastName || user.name;
}
Конфликт в Pull Request
Если PR показывает «This branch has conflicts», нужно:
Метод 1: Sync fork + Update branch (для форков)
- На GitHub: Sync fork → Update branch
- В GitHub Desktop: Fetch origin → Pull
- Branch → Update from default branch
- Разрешите конфликт в редакторе
- Commit → Push → PR обновится
Метод 2: Merge main в ветку
git checkout feature/my-feature
git merge main # здесь возникнет конфликт
# разрешите конфликт
git add .
git commit -m "fix: разрешён конфликт"
git push
Метод 3: Через GitHub (простые конфликты)
GitHub иногда позволяет разрешить конфликт прямо в браузере:
PR → «Resolve conflicts» → редактор в браузере → «Mark as resolved».
Как убедиться что всё разрешено
После разрешения:
- В файле НЕТ строк с <<<<<<<, =======, >>>>>>>
- GitHub Desktop показывает файл без значка конфликта
- PR показывает «No conflicts — This branch has no conflicts with the base branch» ✅
Как избежать конфликтов
Полностью избежать конфликтов невозможно, но можно сократить их частоту:
Делайте маленькие PR
Чем меньше изменений — тем меньше шанс что кто-то тронет тот же файл.
Регулярно обновляйте ветку
git merge main # раз в день обновляйте ветку от main
Договоритесь кто работает с каким файлом
Если двое работают с одним файлом — предупредите друг друга.
Быстро мёрджите PR
PR который «висит» неделю накапливает конфликты. Мёрджите быстрее.
Отменить merge и начать заново
Если запутались — можно всё отменить:
git merge --abort # отменяет merge, возвращает состояние до
В GitHub Desktop: нажмите Abort merge в панели предупреждения.
Конфликты бояться не надо
Конфликты — признак активной командной работы. Чем больше разработчиков работает над проектом — тем чаще возникают конфликты.
Умение разрешать конфликты быстро и правильно — важный навык разработчика. После нескольких раз это становится привычным делом занимающим 2-3 минуты.
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!