Ответ
Конфликт слияния в Git возникает, когда изменения в двух сливаемых ветках (например, при git merge или git rebase) затрагивают одну и ту же строку одного и того же файла, и Git не может автоматически определить, какое изменение применить.
Как выглядит конфликт в файле:
<<<<<<< HEAD (или имя текущей ветки)
Код из текущей ветки (например, main)
=======
Код из сливаемой ветки (например, feature)
>>>>>>> feature-branch
Алгоритм разрешения конфликта:
- Обнаружение: Git сообщит о конфликте и прервет операцию слияния.
- Анализ: Откройте файлы с конфликтами (маркеры
<<<<<<<,=======,>>>>>>>). - Редактирование: Вручную выберите нужный код, объедините изменения или напишите новый вариант. Удалите все маркеры конфликта.
- Завершение:
# Добавьте исправленные файлы в индекс git add <имя_файла> # Завершите слияние коммитом git commit
Инструменты: Для визуального разрешения можно использовать git mergetool (например, meld, kdiff3).
Профилактика: Частые мерджи из основной ветки в feature-ветку, мелкие и атомарные коммиты.
Ответ 18+ 🔞
Да ты посмотри, какая хуйня вылезла! Сидишь ты такой, кодишь в своей ветке feature, как вдруг — бац! — решил смержиться с main, а тебе Git такой: «Ну-ну, дружок, тут у нас конфликт слияния, сам разбирайся, я пас». И всё, операция встала колом, как будто тебе впердолили кирпичом под дых.
А происходит это, когда два умника — то есть ты и кто-то ещё — поправили одну и ту же строчку в одном и том же файле, и Git, туповатый, но честный, не может решить, чей вариант круче. Он не хочет брать на себя такую ответственность, вот и скидывает всё на тебя, подлец.
Как это выглядит в файле, ёпта:
<<<<<<< HEAD (или имя твоей текущей ветки)
Вот тут твой гениальный код, который ты только что написал
=======
А это код из той ветки, которую ты пытаешься притянуть
>>>>>>> feature-branch
Всё, между этими маркерами — поле битвы. Выбирай, чья взяла.
Что делать, когда накрыло:
- Обнаружил. Git уже орал
CONFLICTи свалил с катушек. Дело за тобой. - Вскрывай. Иди в файлы, где эти ебучие угловые скобки торчат, и смотри, что там наворотили.
- Руками ковыряй. Вот тут надо включить мозг. Либо оставляешь свой вариант, либо чужой, либо, если ты не лох, собираешь гибрид — лучшее из обоих миров. Главное — выковыряй нахуй все маркеры (
<<<<<<<,=======,>>>>>>>), чтобы остался чистый, рабочий код. - Закатывай рукава и фиксируй.
# Говоришь Гиту: "Смотри, я тут всё порешал, добавляй это в индекс" git add <имя_файла> # А теперь делаешь коммит, как будто так и было задумано git commitВсё, слияние завершено. Можно выдохнуть.
Если руками ковырять западло, есть специальные штуки — git mergetool. Запустишь, и тебе вылезет графическая программа (типа meld или kdiff3), где всё наглядно: слева твоё, справа — чужое, посередине — что получится. Тыкаешь мышкой и собираешь пазл.
А чтобы не попадать в такие ситуации, как дурак:
- Чаще подтягивай изменения из
mainв свою ветку (git merge mainвfeature). Тогда конфликты будут мелкие и частые, а не один огромный пиздец в конце. - Дроби коммиты. Не делай один коммит на 5000 строк. Маленькие, атомарные изменения — легче мержить, проще откатывать.
Вот и вся магия. Не так страшен чёрт, как его малюют, но иногда он реально может выебать мозг.