Что такое конфликт слияния (merge conflict) в Git?

Ответ

Конфликт слияния в Git возникает, когда изменения в двух сливаемых ветках (например, при git merge или git rebase) затрагивают одну и ту же строку одного и того же файла, и Git не может автоматически определить, какое изменение применить.

Как выглядит конфликт в файле:

<<<<<<< HEAD (или имя текущей ветки)
Код из текущей ветки (например, main)
=======
Код из сливаемой ветки (например, feature)
>>>>>>> feature-branch

Алгоритм разрешения конфликта:

  1. Обнаружение: Git сообщит о конфликте и прервет операцию слияния.
  2. Анализ: Откройте файлы с конфликтами (маркеры <<<<<<<, =======, >>>>>>>).
  3. Редактирование: Вручную выберите нужный код, объедините изменения или напишите новый вариант. Удалите все маркеры конфликта.
  4. Завершение:
    # Добавьте исправленные файлы в индекс
    git add <имя_файла>
    # Завершите слияние коммитом
    git commit

Инструменты: Для визуального разрешения можно использовать git mergetool (например, meld, kdiff3).

Профилактика: Частые мерджи из основной ветки в feature-ветку, мелкие и атомарные коммиты.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня вылезла! Сидишь ты такой, кодишь в своей ветке feature, как вдруг — бац! — решил смержиться с main, а тебе Git такой: «Ну-ну, дружок, тут у нас конфликт слияния, сам разбирайся, я пас». И всё, операция встала колом, как будто тебе впердолили кирпичом под дых.

А происходит это, когда два умника — то есть ты и кто-то ещё — поправили одну и ту же строчку в одном и том же файле, и Git, туповатый, но честный, не может решить, чей вариант круче. Он не хочет брать на себя такую ответственность, вот и скидывает всё на тебя, подлец.

Как это выглядит в файле, ёпта:

<<<<<<< HEAD (или имя твоей текущей ветки)
Вот тут твой гениальный код, который ты только что написал
=======
А это код из той ветки, которую ты пытаешься притянуть
>>>>>>> feature-branch

Всё, между этими маркерами — поле битвы. Выбирай, чья взяла.

Что делать, когда накрыло:

  1. Обнаружил. Git уже орал CONFLICT и свалил с катушек. Дело за тобой.
  2. Вскрывай. Иди в файлы, где эти ебучие угловые скобки торчат, и смотри, что там наворотили.
  3. Руками ковыряй. Вот тут надо включить мозг. Либо оставляешь свой вариант, либо чужой, либо, если ты не лох, собираешь гибрид — лучшее из обоих миров. Главное — выковыряй нахуй все маркеры (<<<<<<<, =======, >>>>>>>), чтобы остался чистый, рабочий код.
  4. Закатывай рукава и фиксируй.
    # Говоришь Гиту: "Смотри, я тут всё порешал, добавляй это в индекс"
    git add <имя_файла>
    # А теперь делаешь коммит, как будто так и было задумано
    git commit

    Всё, слияние завершено. Можно выдохнуть.

Если руками ковырять западло, есть специальные штуки — git mergetool. Запустишь, и тебе вылезет графическая программа (типа meld или kdiff3), где всё наглядно: слева твоё, справа — чужое, посередине — что получится. Тыкаешь мышкой и собираешь пазл.

А чтобы не попадать в такие ситуации, как дурак:

  • Чаще подтягивай изменения из main в свою ветку (git merge main в feature). Тогда конфликты будут мелкие и частые, а не один огромный пиздец в конце.
  • Дроби коммиты. Не делай один коммит на 5000 строк. Маленькие, атомарные изменения — легче мержить, проще откатывать.

Вот и вся магия. Не так страшен чёрт, как его малюют, но иногда он реально может выебать мозг.