Какие методы разрешения конфликтов слияния в Git?

Ответ

Основные подходы к разрешению конфликтов:

1. Ручное разрешение (наиболее распространенный метод)

# После возникновения конфликта:
git status # Показывает конфликтующие файлы

# Редактируем файлы, убираем маркеры конфликта:
<<<<<<< HEAD
Ваши изменения
=======
Изменения из ветки feature
>>>>>>> feature

# После редактирования:
git add <файл>
git commit -m "Разрешил конфликт слияния"

2. Использование инструментов слияния

git mergetool # Запускает настроенный инструмент (vimdiff, kdiff3, etc.)
git config --global merge.tool vimdiff # Настройка инструмента

3. Принятие конкретной версии

# Принять свою версию (локальную):
git checkout --ours <файл>

# Принять чужую версию (удаленную):
git checkout --theirs <файл>

4. Отмена слияния

# Для merge:
git merge --abort

# Для rebase:
git rebase --abort

5. Стратегии автоматического разрешения

# Принять нашу версию при любых конфликтах:
git merge -X ours feature

# Принять их версию:
git merge -X theirs feature

6. Перебазирование с интерактивным разрешением

git rebase -i main
# Во время rebase для каждого конфликта:
git add <разрешенный-файл>
git rebase --continue

Практические советы:

  • Всегда проверяйте результат git diff после разрешения
  • Используйте git log --merge для просмотра коммитов, вызвавших конфликт
  • Для сложных конфликтов используйте git add -p для пошагового добавления изменений

Ответ 18+ 🔞

А, ну вот, подъехали к самому сочному — к конфликтам в гите. Это ж как в семье, блядь: все живут в одном репозитории, а потом бац — и начинается: «Это моя строка кода!», «Нет, моя, я её писал!». Пиздец, а не разработка. Но, хуле, решать-то как-то надо.

Смотри, основные подходы, как из этой помойки не сойти с ума.

1. Ручное разборки (самый народный способ, для настоящих пацанов)

Тут всё просто, как три копейки. Гит тебе наорал, что всё ебнулось. Первым делом — осмотреться.

git status # Показывает конфликтующие файлы

Открываешь файл, а там такая картина маслом, блядь:

<<<<<<< HEAD
Твой гениальный код, который ты три часа писал
=======
Чей-то левый код, который кто-то наваял, пока ты кофе пил
>>>>>>> feature

Задача — сесть, подумать э бошка, и решить, что из этого говна — золото. Стираешь эти ебучие маркеры <<<<<<<, =======, >>>>>>>, оставляешь одну, правильную версию. Или, что чаще бывает, сшиваешь их воедино, чтобы работало. Потом:

git add <файл>
git commit -m "Разрешил конфликт слияния"

И чувствуешь себя богом, который только что предотвратил войну. На пять минут.

2. Инструменты для ленивых (или для умных, хз)

Зачем руками ковыряться, если можно ткнуть кнопочку?

git mergetool # Запускает настроенный инструмент (vimdiff, kdiff3, etc.)

Но его же ещё настроить надо, ёпта!

git config --global merge.tool vimdiff # Настройка инструмента

Если разберёшься — красота. Если нет — опять ручками, как в каменном веке.

3. Жёсткая позиция «Я всегда прав» (или «Похуй, пусть будет как у них»)

Иногда спорить нет сил. Хочешь оставить своё — оставляй своё. Хочешь забрать чужое — забирай чужое. Всё просто, как хуй с горы.

# Принять свою версию (локальную, «нашу»):
git checkout --ours <файл>

# Принять чужую версию (удалённую, «ихнюю»):
git checkout --theirs <файл>

Бум, и нет конфликта. Правда, есть риск похерить что-то важное, но кто ж об этом думает, когда терпения ноль ебать.

4. Так, всё, отмена, я передумал!

Начал мержить или ребейзить, увидел, что там овердохуища конфликтов, и понял — не сегодня, сука.

# Для merge:
git merge --abort

# Для rebase:
git rebase --abort

Всё, откатились. Можно пойти выпить чаю и сделать вид, что ничего не было. Идеальный вариант.

5. Автоматическое «Решай за меня, я устал»

Гиту можно сказать: «Слушай, в случае чего бери моё (или их)». Он попробует сам всё порешать.

# Принять нашу версию при любых конфликтах:
git merge -X ours feature

# Принять их версию:
git merge -X theirs feature

Работает не всегда, но иногда спасает. Как казино: может повезти, а может и нет.

6. Ребейз — это когда ты сам нарываешься на боль

Ребейз — он такой хитрожопый. Ты как бы переписываешь историю, и конфликты могут вылезать на каждом шагу.

git rebase -i main

И вот ты уже в аду. На каждом конфликте:

git add <разрешенный-файл>
git rebase --continue

Пока не дойдёшь до конца или не сойдёшь с ума. Обычно второе наступает раньше.

Ну и напоследок, практические советы от бывалого:

  • Всегда, блядь, всегда смотри, что получилось, через git diff. А то разрешишь конфликт, закоммитишь, а там одна ерунда.
  • Хочешь понять, кто начал эту пьянку — git log --merge покажет коммиты, из-за которых всё пошло по пизде.
  • Если конфликт сложный, как жизнь, используй git add -p. Это чтобы добавлять изменения по кусочкам, а не всё скопом. Так меньше шансов накосячить.

Вот и вся наука. Главное — не бояться. Ну или бояться, но делать. И помни: после каждого успешно разрешённого конфликта ты становишься на шаг ближе к просветлению. Или к нервному срыву. Как повезёт.