Gernar
Frontend DeveloperGit, сборка и DevOps

Интервью-вопрос

Что такое git rebase

Git rebase переприменяет коммиты поверх новой базы и помогает держать историю линейной. Главный риск: он переписывает историю, поэтому с опубликованными ветками нужен осторожный workflow.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше сказать про git rebase на интервью?

Вы хотите дать короткое определение без лишней лекции.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Короткий ответ: 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, ревьюеру будет проще читать изменения.

Как выбрать безопасный подход

1Вы работаете в своей локальной feature-ветке и хотите подтянуть свежий main?
Обычно подходит git rebase main, если команда разрешает линейную историю.
2Ветка уже общая и на нее опираются другие разработчики?
Без договоренности лучше выбрать merge. Так вы не переписываете чужую базу.
3Нужно привести последние локальные коммиты в порядок перед PR?
Используйте git rebase -i для squash, reword или удаления случайного коммита.
4После rebase нужно запушить переписанную личную ветку?
Используйте 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 для затронутого сценария.

Безопасный rebase
  1. 1Обновить main из remote
  2. 2Перейти в свою feature-ветку
  3. 3Выполнить git rebase main
  4. 4Решить конфликты и продолжить rebase
  5. 5Запустить typecheck, тесты, линтер или сборку
  6. 6Проверить затронутые UI-сценарии, если конфликт был в общем коде
Опасный rebase
  1. 1Переписать общую ветку без предупреждения
  2. 2Запушить через git push --force
  3. 3Не проверить, что remote не изменился
  4. 4Пропустить сборку после конфликтов
  5. 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. 1

    Считать rebase обычным переносом

    Rebase не двигает старые коммиты как файлы на диске. Он создает новые коммиты с теми же изменениями поверх новой базы, поэтому меняются хэши. Если не сказать это на интервью, ответ будет звучать поверхностно.
  2. 2

    Переписывать общую ветку

    Если другие разработчики уже забрали ветку, rebase ломает для них привычную историю. Без договоренности лучше использовать git merge или заранее согласовать переписывание и порядок действий.
  3. 3

    Пушить через обычный force

    git push --force может затереть чужие коммиты, которые появились на remote после вашего последнего fetch. Если нужно обновить личную переписанную ветку, безопаснее использовать git push --force-with-lease.
  4. 4

    Удалять lockfile при конфликте

    Удаление lockfile без понимания причины может поменять версии пакетов у всей команды. Во frontend это легко превращается в другую сборку, неожиданные типы или баг в рантайме. Безопаснее решить конфликт, выполнить установку тем же пакетным менеджером и проверить итоговый lockfile в diff.
  5. 5

    Не проверять проект после конфликтов

    Конфликт можно решить так, что код компилируется, но UI работает не так, как ожидалось. После rebase во frontend-проекте стоит запустить хотя бы релевантные тесты, линтер или сборку, особенно если конфликт был в зависимостях, типах или общем компоненте.
  6. 6

    Путать rebase и squash merge

    Интерактивный rebase может объединить локальные коммиты через squash, но это не то же самое, что squash merge в интерфейсе репозитория. На интервью лучше разделять локальную подготовку истории и стратегию попадания изменений в основную ветку.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют, умеете ли вы безопасно использовать rebase в команде.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание