Почему для локального слияния веток в Git предпочитают использовать rebase вместо merge?

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

Ответ

Команда git rebase используется для перезаписи истории коммитов, чтобы получить линейную и чистую историю проекта. Её предпочитают merge для интеграции изменений из одной ветки в другую в локальной работе.

Преимущества rebase перед merge для локальных веток:

  1. Линейная история: rebase перемещает всю цепочку коммитов вашей feature-ветки на вершину целевой ветки (например, main), создавая иллюзию, что работа была выполнена последовательно. Это устраняет лишние merge-коммиты и упрощает анализ истории (git log --oneline).
  2. Чистота и читаемость: История становится прямой линией, что облегчает использование git bisect для поиска багов и понимания эволюции кода.
  3. Подготовка к пулл-реквесту: Перед созданием пулл-реквеста rebase вашей ветки на актуальный main/develop является стандартной практикой, чтобы гарантировать, что ваши изменения могут быть применены чисто.

Типичный рабочий процесс:

# Работаем в feature-ветке
$ git checkout feature/login
# ... делаем коммиты

# Перед интеграцией обновляем целевую ветку
$ git checkout main
$ git pull origin main

# Возвращаемся в feature-ветку и перебазируем её
$ git checkout feature/login
$ git rebase main
# Разрешаем возможные конфликты для каждого коммита по очереди

# Теперь можно выполнить fast-forward merge в main
$ git checkout main
$ git merge feature/login

ВАЖНОЕ ПРАВИЛО: Никогда не используйте rebase для коммитов, которые уже были отправлены в общий (удалённый) репозиторий и с которыми могли работать другие разработчики. Это перезапишет историю и вызовет проблемы при последующем git push. Rebase — инструмент для локальной очистки истории.