Модуль 4: Слияние и разрешение конфликтов
Научимся объединять ветки и безопасно решать конфликты при слиянии.
Слияние — это момент истины для истории: именно здесь разрозненные линии разработки сходятся в единый результат. Важно понимать не только синтаксис команд, но и их последствия для графа коммитов и читаемости истории.
4.1 Стратегии слияния
- Fast‑Forward: просто перемещается указатель ветки
- 3‑way merge: создаётся новый merge‑коммит
# FF (если возможно)
git switch main
git merge feature/login
# Принудительно создать merge-коммит
git merge --no-ff feature/login
FF поддерживает линейную историю, но скрывает факт существования отдельной ветки. Merge‑коммит фиксирует точку слияния, что полезно для аудита и поиска регрессий. Выбор стратегии — это компромисс между «чистотой» и информативностью.
4.2 Почему возникают конфликты
Одинаковые строки изменены по‑разному в разных ветках. Git не может выбрать автоматически.
Конфликт — не ошибка системы, а сигнал к принятию решения. Используйте контекст истории (diff/log, ссылки на задачи), чтобы понять исходный замысел и примирить альтернативы.
4.3 Маркеры конфликтов
<<<<<<< HEAD
текущая версия
=======
версия из feature/login
>>>>>>> feature/login
4.4 Разрешение конфликтов
- Откройте конфликтующие файлы и вручную выберите правильный вариант
- Добавьте исправленные файлы в staging:
git add
- Завершите слияние:
git commit
Стремитесь минимизировать область конфликта: разбивайте большие правки на коммиты, синхронизируйтесь с основной веткой чаще, используйте инструменты сравнения, чтобы увидеть «настоящие» различия, а не шум форматирования.
4.5 Инструменты
- Встроенный мердж‑инструмент в IDE/VS Code
- Внешние: meld, kdiff3 и др.
Инструменты не принимают решения за вас, но помогают увидеть контекст. Старайтесь смотреть на изменения «по смыслу», включая переименования и перемещения кода.
4.6 Стратегии и опции merge
--ff
/--no-ff
/--ff-only
— управление fast‑forward--squash
— объединить изменения без создания merge‑коммита- Стратегии:
ort
(по умолчанию),recursive
(истор.),octopus
(много веток)
4.7 Алгоритмы ort и recursive
ort — современный быстрый алгоритм с улучшенной детекцией переименований и разрешением конфликтов. recursive — предыдущий алгоритм; полезен для понимания истории и некоторых кейсов.
4.8 Переименования и пробелы
Git выполняет эвристическую детекцию переименований, сравнивая сходство содержимого. На конфликт влияет обработка пробелов: опции --ignore-space-change
, --ignore-all-space
, атрибуты .gitattributes
(например, *.md text eol=lf
).
4.9 rerere: Reuse Recorded Resolution
rerere
запоминает решения конфликтов и повторно применяет их при схожих конфликтах. Включается конфигурацией, хранит отпечатки конфликтных участков в .git/rr-cache
.
4.10 Squash merge и история
--squash
создаёт один коммит вместо merge‑коммита, скрывая детализацию ветки. Это упрощает историю, но теряет информацию о происхождении отдельных коммитов.