Модуль 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‑коммита, скрывая детализацию ветки. Это упрощает историю, но теряет информацию о происхождении отдельных коммитов.