В чем разница между git merge и git rebase?

«В чем разница между git merge и git rebase?» — вопрос из категории CI/CD и DevOps, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

git merge и git rebase — это два разных подхода к интеграции изменений из одной ветки в другую, каждый со своей философией работы с историей.

Визуальное отличие

До операции:

main:     A---B---C
feature:       D---E

После git merge:

main:     A---B---C---F
                      
feature:       D---E---/
# F — merge-коммит, объединяющий C и E

После git rebase feature на main:

main:     A---B---C
feature:           D'---E'
# D и E переписаны как D' и E', будто были сделаны после C

Практические примеры

# Способ 1: Merge (сохраняет историю как есть)
git checkout main
git merge feature
# Создается merge-коммит с сообщением по умолчанию

# Способ 2: Rebase (переписывает историю)
git checkout feature
git rebase main
# Коммиты feature теперь идут после коммитов main
git checkout main
git merge feature  # Теперь это fast-forward merge

Сравнение подходов

Аспект git merge git rebase
История Сохраняет полную историю с merge-коммитами Создает линейную историю без merge-коммитов
Безопасность Не изменяет существующие коммиты Переписывает историю (меняет хеши коммитов)
Сложность Проще, меньше рисков Требует понимания, может вызвать конфликты
Идеально для Публичных веток (main, develop) Локальных веток перед интеграцией

Когда что использовать

Используйте git merge когда:

  • Работаете с общей/публичной веткой
  • Важна точная история всех изменений
  • Не хотите рисковать переписыванием истории
  • Интегрируете завершенные фичи

Используйте git rebase когда:

  • Работаете в локальной ветке
  • Хотите чистую линейную историю
  • Нужно интегрировать изменения из основной ветки
  • Готовы разрешать конфликты последовательно

⚠️ Критически важное правило

Никогда не делайте rebase коммитов, которые уже были отправлены в общий репозиторий! Это изменит историю для всех участников и вызовет серьезные проблемы с синхронизацией.

# ОПАСНО: если коммиты уже были отправлены
git push origin feature  # Отправили коммиты D и E
git rebase main          # Переписали историю → D' и E'
git push --force         # Принудительная отправка → проблемы у коллег