Редактировал ли историю коммитов с помощью rebase в Git?

«Редактировал ли историю коммитов с помощью rebase в Git?» — вопрос из категории DevOps, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Типичный сценарий использования: После завершения работы над фичей в отдельной ветке и перед созданием Pull Request (или Merge Request) я выполняю интерактивный rebase на актуальную main (или develop), чтобы:

  1. Перебазировать мои коммиты на актуальную основу.
  2. Объединить (squash) мелкие или исправительные коммиты в логические блоки.
  3. Переписать сообщения коммитов для ясности.
# Переключаюсь на свою feature-ветку
$ git checkout feature/optimize-algorithm

# Получаю последние изменения из основной ветки
$ git fetch origin

# Выполняю интерактивный rebase на origin/main
$ git rebase -i origin/main

В открывшемся редакторе я могу:

  • Изменить pick на squash (или s), чтобы объединить коммит с предыдущим.
  • Изменить pick на reword (или r), чтобы изменить сообщение коммита.
  • Изменить pick на edit (или e), чтобы внести изменения в сам коммит (например, добавить забытый файл).
  • Переставить строки, чтобы изменить порядок коммитов.

Пример итоговой истории после rebase: До: "Add initial impl", "Fix typo", "Add missing include", "Optimize loop" После: "Implement fast Fourier transform algorithm"

Важное предостережение: Я никогда не выполняю rebase для коммитов, которые уже были отправлены в общую ветку и могли быть склонированы другими разработчиками. Это правило "золотого стандарта" для избежания переписывания публичной истории и конфликтов.