Что делает команда `git rebase` и когда её использовать?

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

Ответ

git rebase — это команда для перезаписи истории коммитов. Она переносит цепочку коммитов из текущей ветки и применяет их поверх указанной базовой ветки, создавая линейную историю.

Основное использование:

  1. Обновление feature-ветки:

    # Находясь в ветке feature-branch
    git fetch origin          # Получить свежие коммиты с удаленного репозитория
    git rebase origin/main    # Перебазировать feature-branch на актуальный main

    Это переместит ваши коммиты на вершину main, как если бы вы начали работу с самой последней версии.

  2. Интерактивное перебазирование (-i): Позволяет редактировать историю коммитов перед их применением.

    git rebase -i HEAD~3  # Редактировать последние 3 коммита

    Откроется редактор, где можно:

    • pick — оставить коммит как есть.
    • squash — объединить коммит с предыдущим.
    • reword — изменить сообщение коммита.
    • edit — остановиться для внесения изменений в коммит.
    • drop — удалить коммит.

Преимущества перед git merge:

  • Чистая история: Избегает лишних merge-коммитов, история становится линейной и легко читаемой.
  • Упрощает навигацию: Легче следовать за развитием фичи в git log.

Критически важные правила:

  • НИКОГДА не перебазируйте коммиты, которые уже были отправлены в общий репозиторий (push). Это перезапишет историю для других разработчиков и вызовет конфликты.
  • Используйте rebase только для локальных коммитов в вашей приватной ветке.

Стандартный рабочий процесс:

git checkout -b my-feature  # Создать и перейти в feature-ветку
# ... делаем коммиты ...
git fetch origin
git rebase origin/main      # Обновить ветку относительно main
# Решить возможные конфликты, затем продолжить:
git rebase --continue
# Когда ветка готова, можно смержить через fast-forward:
git checkout main
git merge my-feature