Ответ
В Git есть несколько стратегий слияния веток, каждая со своими особенностями применения.
1. Fast-forward Merge (быстрая перемотка) Используется, когда целевая ветка не имеет новых коммитов после создания feature-ветки.
# Переключиться на основную ветку
git checkout main
# Выполнить слияние
git merge feature/login
# История остается линейной
# main: A---B---C---D (feature/login сливается без merge-коммита)
2. Recursive Merge (рекурсивное слияние) с merge-коммитом Стандартный способ при наличии расхождений в истории.
git checkout main
git merge feature/payment --no-ff # --no-ff гарантирует создание merge-коммита
# Создается коммит слияния с двумя родителями
# main: A---B---C---M
#
# feature: D---E
3. Rebase (перебазирование) Перемещает коммиты feature-ветки на вершину основной ветки для линейной истории.
# Находясь в feature-ветке
git checkout feature/search
git rebase main
# Разрешение возможных конфликтов
git add .
git rebase --continue
# После rebase - fast-forward merge в main
git checkout main
git merge feature/search
4. Squash Merge (объединение с сжатием) Объединяет все коммиты feature-ветки в один коммит при слиянии.
git checkout main
git merge --squash feature/refactor
git commit -m "Рефакторинг модуля аутентификации"
# В истории main появится один коммит со всеми изменениями
Практические рекомендации:
# Рабочий процесс с feature-ветками
# 1. Создать ветку от актуальной main
git checkout main
git pull origin main
git checkout -b feature/user-profile
# 2. Работать в ветке, делать коммиты
git add .
git commit -m "Добавлен базовый компонент профиля"
git commit -m "Реализована загрузка аватара"
# 3. Синхронизировать с main перед слиянием
git fetch origin
git rebase origin/main
# ИЛИ
git merge origin/main
# 4. Слить изменения в main
# Способ зависит от политики команды:
# Вариант A: Merge commit (сохраняет историю)
git checkout main
git merge --no-ff feature/user-profile
# Вариант B: Rebase + fast-forward (чистая история)
git checkout feature/user-profile
git rebase main
git checkout main
git merge feature/user-profile
# Вариант C: Squash (одно изменение)
git checkout main
git merge --squash feature/user-profile
git commit -m "Реализация профиля пользователя"
Когда что использовать:
- Fast-forward: для короткоживущих веток без параллельных изменений
- Merge commit: для долгоживущих feature-веток, важно сохранить историю
- Rebase: для поддержания чистой линейной истории перед PR
- Squash: когда feature-ветка содержит много промежуточных коммитов
Разрешение конфликтов:
# При конфликте Git сообщит об ошибке
# Нужно отредактировать файлы с конфликтами, затем:
git add resolved-file.js
git merge --continue # или git rebase --continue
# Для отмены слияния:
git merge --abort
git rebase --abort