Какие методы слияния (merge) веток вы использовали в Git и в каких случаях?

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

Ответ

В Git применяются разные методы слияния в зависимости от целей: сохранения истории, ее упрощения или разрешения конфликтов.

Основные методы и их применение:

  1. Fast-Forward Merge (git merge)

    • Когда использовать: Когда целевая ветка (main) не имеет новых коммитов после создания feature-ветки. История остается линейной.
    • Команда: git merge feature-branch
    • Результат: Указатель ветки main просто перематывается на коммит feature-branch. Merge-коммит не создается.
  2. Recursive Merge / Merge Commit (git merge --no-ff)

    • Когда использовать: Стандартный случай, когда ветки разошлись. Явно показывает, что была выполнена операция слияния.
    • Команда: git merge --no-ff feature-branch
    • Результат: Создается новый merge-коммит с двумя родителями, что сохраняет полную историю разработки фичи.
  3. Rebase + Merge (git rebase)

    • Когда использовать: Чтобы получить чистую линейную историю, перенеся коммиты feature-ветки на вершину main.
    • Команда:
      git checkout feature-branch
      git rebase main   # Перебазируем feature-branch на актуальный main
      git checkout main
      git merge feature-branch # Теперь слияние будет fast-forward
    • Результат: История выглядит так, как если бы фича разрабатывалась последовательно поверх main. Меняет историю, не использовать для публичных веток.
  4. Squash Merge (git merge --squash)

    • Когда использовать: Чтобы объединить все коммиты feature-ветки в один логический коммит перед слиянием в main. Упрощает историю.
    • Команда:
      git merge --squash feature-branch
      git commit -m "feat: add new payment gateway"
    • Результат: В main добавляется один новый коммит со всеми изменениями из ветки. Детальная история коммитов фичи теряется.

Выбор стратегии:

  • --no-ff — для важных фич, чтобы сохранить контекст.
  • Rebase — для личных веток и поддержания линейной истории.
  • Squash — для чистки "рабочих" коммитов перед мержем в основную ветку.