Интервью-вопрос
Что такое git rebase
Git rebase переприменяет коммиты поверх новой базы и помогает держать историю линейной. Главный риск: он переписывает историю, поэтому с опубликованными ветками нужен осторожный workflow.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
Короткий ответ: git rebase меняет базу для ваших коммитов. Если вы работали в ветке feature/login, а main ушел вперед, rebase позволяет взять ваши коммиты и применить их поверх нового состояния main.
Не ограничивайтесь фразой "переносит коммиты". Точнее так: Git создает новые коммиты с теми же изменениями, но уже на другой базе. Поэтому меняются хэши, а значит меняется история ветки.
Типичный сценарий:
git switch main
git pull
git switch feature/login
git rebase mainПосле этого история feature-ветки выглядит так, будто вы начали работу от свежего main. Это удобно для читаемого PR и для проектов, где команда предпочитает линейную историю.
Что происходит с историей
Представьте, что ваша ветка ответвилась от старого коммита main. Потом в main появились новые изменения. Rebase не добавляет merge-коммит. Он заново применяет ваши изменения поверх нового конца main.
До rebase:
A - B - C main
\
D - E featureПосле git rebase main:
A - B - C main
\
D' - E' featureКоммиты D' и E' похожи на старые D и E по изменениям, но это уже новые объекты Git. Поэтому нельзя говорить, что rebase ничего не меняет в истории.
Когда выбирать rebase, а когда merge
На интервью лучше не спорить, что всегда лучше. Покажите критерий выбора. Rebase удобен, когда вы работаете со своей веткой и хотите получить чистую последовательность коммитов. Merge безопаснее, когда нужно объединить уже опубликованные ветки и сохранить факт объединения.
Для frontend-разработчика это практичный вопрос. Если вы перепишете историю общей ветки с компонентами дизайн-системы, коллеги могут получить расхождение локальных веток, дубли коммитов и сложные конфликты. Если вы аккуратно сделаете rebase своей feature-ветки перед PR, ревьюеру будет проще читать изменения.
Как выбрать безопасный подход
Обычно подходит git rebase main, если команда разрешает линейную историю.Без договоренности лучше выбрать merge. Так вы не переписываете чужую базу.Используйте git rebase -i для squash, reword или удаления случайного коммита.Используйте git push --force-with-lease и убедитесь, что никто не добавил новые коммиты в эту ветку.Что это меняет для Frontend Developer
Rebase сам по себе не меняет работу браузера или React. Риск появляется после конфликтов и новой базы. Вы могли получить свежий код дизайн-системы, новый API-клиент, другой lockfile или изменения в роутинге. Git применит патч, но не проверит, что форма показывает правильный loading, ошибка не потерялась, а общий компонент не сломал доступность.
Поэтому после rebase проверяйте не только статус Git. Посмотрите diff, запустите доступные проверки и пройдите руками затронутый сценарий, если конфликт был в UI, сетевом слое, типах, зависимостях или общем компоненте.
Интерактивный rebase
git rebase -i открывает список коммитов и позволяет отредактировать локальную историю. Обычно его используют перед pull request, чтобы убрать шум. Например, объединить несколько мелких коммитов, поправить сообщение, удалить случайный коммит с временным логом.
Пример:
git rebase -i HEAD~3В редакторе можно оставить pick, заменить на reword для изменения сообщения, использовать squash для объединения коммитов. Это полезно, если в истории есть коммиты вроде fix typo, wip и try again.
Но интерактивный rebase не должен прятать важный контекст от команды. Если изменение рискованное, например затрагивает авторизацию, роутинг или оплату, лучше оставить историю и описание PR такими, чтобы ход решения был понятен.
Конфликты и безопасный workflow
Во время rebase Git применяет ваши коммиты по одному. Поэтому один и тот же файл может конфликтовать несколько раз, если несколько ваших коммитов меняли одну область. Это нормально, но требует внимания.
Базовая последовательность при конфликте:
# исправьте конфликтные файлы руками
git add src/components/LoginForm.tsx
git rebase --continueЕсли вы поняли, что начали rebase не на ту ветку или конфликт стал слишком рискованным, можно отменить процесс:
git rebase --abortПосле успешного rebase не ограничивайтесь тем, что Git завершил команду. Запустите проверки, которые реально ловят ошибки в вашем проекте: тесты, линтер, typecheck или сборку. Если конфликт был в UI или сетевом слое, дополнительно проверьте loading, error и empty state для затронутого сценария.
- 1Обновить main из remote
- 2Перейти в свою feature-ветку
- 3Выполнить git rebase main
- 4Решить конфликты и продолжить rebase
- 5Запустить typecheck, тесты, линтер или сборку
- 6Проверить затронутые UI-сценарии, если конфликт был в общем коде
- 1Переписать общую ветку без предупреждения
- 2Запушить через git push --force
- 3Не проверить, что remote не изменился
- 4Пропустить сборку после конфликтов
- 5Оставить коллегам расходящуюся историю
Риск force push
После rebase опубликованной личной ветки обычный git push может быть отклонен, потому что remote хранит старую историю. Это ожидаемо. Локальная ветка теперь содержит новые хэши.
Плохой сценарий:
git push --forceТак можно затереть чужие изменения, если кто-то успел запушить коммиты в эту же ветку. Более безопасный вариант для личной ветки:
git push --force-with-lease--force-with-lease проверяет, что remote все еще находится в ожидаемом состоянии. Это не делает rebase общей ветки хорошей идеей, но снижает риск случайно перезаписать чужую работу.
Как ответить на интервью
Можно ответить так:
Git rebase переприменяет коммиты текущей ветки поверх другой базы, например поверх свежего main. Это делает историю линейной и часто удобно перед pull request. Но rebase переписывает историю, потому что у коммитов меняются хэши. Поэтому я использую его в своих локальных feature-ветках и не делаю молча на общих ветках.
Если хотите усилить ответ, добавьте практику:
При конфликте я исправляю файлы, делаю git add и продолжаю через git rebase --continue. Если ветку после rebase нужно обновить на remote, для личной ветки использую git push --force-with-lease. После конфликтов запускаю проверки проекта.
Такой ответ показывает три вещи: вы понимаете механику Git, умеете выбирать безопасный workflow и думаете о последствиях для команды.
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Считать rebase обычным переносом
Rebase не двигает старые коммиты как файлы на диске. Он создает новые коммиты с теми же изменениями поверх новой базы, поэтому меняются хэши. Если не сказать это на интервью, ответ будет звучать поверхностно. - 2
Переписывать общую ветку
Если другие разработчики уже забрали ветку, rebase ломает для них привычную историю. Без договоренности лучше использоватьgit mergeили заранее согласовать переписывание и порядок действий. - 3
Пушить через обычный force
git push --forceможет затереть чужие коммиты, которые появились на remote после вашего последнего fetch. Если нужно обновить личную переписанную ветку, безопаснее использоватьgit push --force-with-lease. - 4
Удалять lockfile при конфликте
Удаление lockfile без понимания причины может поменять версии пакетов у всей команды. Во frontend это легко превращается в другую сборку, неожиданные типы или баг в рантайме. Безопаснее решить конфликт, выполнить установку тем же пакетным менеджером и проверить итоговый lockfile в diff. - 5
Не проверять проект после конфликтов
Конфликт можно решить так, что код компилируется, но UI работает не так, как ожидалось. После rebase во frontend-проекте стоит запустить хотя бы релевантные тесты, линтер или сборку, особенно если конфликт был в зависимостях, типах или общем компоненте. - 6
Путать rebase и squash merge
Интерактивный rebase может объединить локальные коммиты черезsquash, но это не то же самое, что squash merge в интерфейсе репозитория. На интервью лучше разделять локальную подготовку истории и стратегию попадания изменений в основную ветку.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют, умеете ли вы безопасно использовать rebase в команде.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое Git 😎
Git это распределенная система контроля версий для истории изменений, веток и совместной работы. Разбираем, как объяснить его на интервью и какие практические риски важно упомянуть фронтенд-разработчику.
Что такое CI/CD 😎
CI/CD автоматизирует проверку, сборку и доставку кода. На странице разбираем разницу между CI, Continuous Delivery и Continuous Deployment, а также риски для фронтенд-проекта.