Какие способы слияния веток существуют в Git и когда их использовать?

«Какие способы слияния веток существуют в Git и когда их использовать?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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