Ответ
Основные подходы к разрешению конфликтов:
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. Это чтобы добавлять изменения по кусочкам, а не всё скопом. Так меньше шансов накосячить.
Вот и вся наука. Главное — не бояться. Ну или бояться, но делать. И помни: после каждого успешно разрешённого конфликта ты становишься на шаг ближе к просветлению. Или к нервному срыву. Как повезёт.