#git-merge-vs-rebase-history
Чем merge отличается от rebase с точки зрения истории?
Что отвечать
`merge` сохраняет историю как есть: остаются два ствола и появляется merge-коммит с двумя родителями. `rebase` берёт коммиты твоей ветки, отрезает их и наклеивает поверх target-ветки - получается линейная история, но **с новыми SHA**, потому что у коммитов поменялся родитель. Merge безопасен и не переписывает, rebase даёт чистую историю ценой переписанных коммитов.
Что хотят услышать
Кандидат должен: - сказать что rebase переписывает SHA коммитов, merge - нет - объяснить почему линейная история удобнее для `git log`, `bisect`, и для PR-обзора, а merge-коммит «съедает» контекст и плохо читается - назвать когда merge лучше: feature-ветки которые шли долго, и в истории важно видеть «здесь параллельный поток разрабатывался» - назвать когда rebase лучше: подтянуть свежий main перед PR, синхронизировать локальную ветку без merge-коммита - упомянуть что в больших командах часто принят rebase локально + merge при слиянии PR (см. squash-merge ниже)
Подводные камни
- ✗ Сказать «rebase лучше merge всегда» - не лучше, на shared-ветке rebase ломает чужие копии
- ✗ Думать что merge без конфликтов это всегда fast-forward - не всегда, если main продвинулся, будет three-way merge
- ✗ Перепутать `git rebase main` (вытащить мои коммиты поверх main) и `git rebase --onto` (переставить произвольный диапазон)
Follow-up
- ? Что произойдёт с SHA коммитов после `git rebase main` в feature-ветке?
- ? Как откатить неудачный rebase?
- ? Чем three-way merge отличается от fast-forward?
Глубина в базе знаний