> Что происходит с коммитами ветки feature при выполнении rebase на ветку develop (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Лига Цифровой Экономики
Стек: Go
> Пример ответа
Короткий ответ
При git rebase feature develop коммиты ветки feature не удаляются и не теряются - они пересоздаются поверх актуального состояния develop. Каждый коммит feature получает новые SHA-1 хеши, так как меняются родительские связи и, возможно, содержимое при разрешении конфликтов. Старые коммиты остаются в reflog до сборки мусора. Ветка feature перемещается на новую цепочку коммитов, а develop остаётся без изменений.
Подробное объяснение
Rebase - это операция, которая переписывает историю ветки. Механизм работы:
- Git находит общий предок (merge base) между feature и develop.
- Вычисляет набор коммитов, уникальных для feature (от merge base до tip feature).
- Перемещает указатель feature на tip develop.
- Последовательно применяет каждый коммит из набора поверх нового base.
Каждый коммит применяется заново через механизм cherry-pick: создаётся новый коммит с тем же автором, сообщением и изменениями, но с новым родителем и временем. Если изменения конфликтуют с текущим состоянием develop, git приостанавливает rebase и просит разрешить конфликт.
Важные следствия:
- SHA-1 хеши всех перемещённых коммитов изменяются, даже если содержимое идентично.
- Оригинальные коммиты остаются доступны через
git reflogпримерно 30 дней (настраивается черезgc.reflogExpire). - Если rebase прерван на середине, ветка feature находится в состоянии detached HEAD - нужно либо продолжить (
git rebase --continue), либо отменить (git rebase --abort). - Rebase не трогает develop - только feature перемещается.
На практике
Для senior-разработчика важно понимать не только механику, но и последствия для командной работы:
- Rebase переписывает историю - если feature уже запушена в общий remote, другие разработчики получат конфликты при pull. Нужно использовать
git pull --rebaseили force-push с осторожностью. - После rebase на develop история становится линейной - это удобно для code review и git bisect.
- Если feature долго живёт и develop сильно ушёл вперёд, rebase может потребовать разрешения множества конфликтов. Альтернатива - merge, который сохраняет историю, но создаёт merge commit.
- Для long-running веток (например, release) merge предпочтительнее, для коротких feature-веток - rebase.
- Перед rebase стоит сделать бэкап ветки:
git branch feature-backup.
Пример кода
BASH# Переключиться на feature и выполнить rebase на developgit checkout featuregit rebase develop# Если конфликты - разрешить, затем:git add <resolved-files>git rebase --continue# Отмена rebase при проблемахgit rebase --abort# Просмотр оригинальных коммитов после rebasegit reflog# Force push после rebase, если ветка уже была запушенаgit push --force-with-lease origin feature
Как отвечать на собеседовании
Начни с краткого определения: rebase пересоздаёт коммиты поверх другого base. Затем опиши последовательность шагов: поиск merge base, вычисление уникальных коммитов, применение поверх нового base. Обязательно упомяни, что хеши меняются, а старые коммиты остаются в reflog.
Покажи понимание практических последствий: линейная история, конфликты, force-push. Если спросят про отличие от merge - подчеркни, что merge сохраняет историю и создаёт merge commit, а rebase переписывает её.
Для senior-уровня добавь рассуждение о trade-off: rebase даёт чистую историю, но опасен для общих веток. Упомяни --force-with-lease как безопасную альтернативу force-push.
Что проверяет интервьюер
- Понимание внутреннего механизма git: merge base, cherry-pick, пересоздание коммитов.
- Осознание, что хеши меняются и оригинальные коммиты не теряются мгновенно.
- Умение оценивать риски: переписывание публичной истории, конфликты.
- Практические навыки: команды для разрешения конфликтов, отмены rebase, force-push.
- Способность объяснить, когда rebase уместен, а когда лучше merge.
Типичные ошибки
- Утверждение, что rebase удаляет коммиты - они остаются в reflog.
- Забывают, что хеши меняются даже без изменений содержимого.
- Путают порядок:
git rebase developиз ветки feature, а не наоборот. - Не упоминают про detached HEAD при конфликте.
- Рекомендуют force-push без
--force-with-lease- это опасно для командной работы. - Говорят, что rebase "переносит" коммиты - на самом деле они пересоздаются.
> Похожие задачи по Go
Какой параметр использовать для партицирования, который не меняется со временем и помогает оптимизировать запрос
Можно ли локально отменить предыдущий коммит, чтобы изменения попали в staging
Где выгодно и безопасно использовать неизменяемые объекты
Можно ли в одном типе миксовать методы с ресиверами по значению и по указателю и хорошо ли это
> Похожие задачи по backend
Какой параметр использовать для партицирования, который не меняется со временем и помогает оптимизировать запрос
Можно ли локально отменить предыдущий коммит, чтобы изменения попали в staging
Где выгодно и безопасно использовать неизменяемые объекты
Можно ли в одном типе миксовать методы с ресиверами по значению и по указателю и хорошо ли это
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью