Какую роль выполняет базовый коммит (base commit) в операции git rebase?

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

Ответ

Базовый коммит (base commit) в git rebase определяет точку, начиная с которой будут переприменены коммиты текущей ветки. Это позволяет изменить историю, переместив цепочку коммитов на новый "фундамент".

Почему это важно? Без указания базового коммита rebase по умолчанию использует upstream-ветку, что не всегда подходит для сложных манипуляций с историей.

Ключевое использование — флаг --onto:

git rebase --onto <new_base> <old_base> <branch>
  • <new_base> — коммит, на который будут перемещены изменения.
  • <old_base> — последний общий коммит, который не должен быть перемещен (обычно точка ветвления).
  • <branch> — ветка, чьи коммиты перебазируются.

Практический пример: Перенос коммитов из feature на main, минуя промежуточные коммиты в develop.

# Текущая история: main --- A --- B (feature)
#                     
#                      C --- D (develop)
# Цель: переместить B на main

git rebase --onto main develop feature
# Результат: main --- A --- B (feature)
#                     
#                      C --- D (develop)

Основные сценарии:

  1. Исправление точки ветвления — когда ветка ошибочно создана не от того коммита.
  2. Перенос коммитов между ветками — как в примере выше.
  3. Очистка истории — удаление слияний или промежуточных коммитов перед интеграцией.