
Git rebase переносит коммиты текущей ветки на новую базу. Команда полезна, когда нужно обновить рабочую ветку перед слиянием и убрать лишний merge-коммит из истории. Но rebase переписывает идентификаторы коммитов, поэтому к опубликованной общей ветке его применяют осторожно.
Перед началом определите, какая ветка считается базовой и есть ли у коллег незапушенные изменения. Для личной feature-ветки операция обычно безопасна. Для main, develop или ветки, которую уже используют другие, сначала согласуйте способ обновления.
Как работает rebase
Представьте, что main получил новые коммиты, пока вы работали в feature/login. Rebase временно снимает ваши коммиты, перемещает ветку на актуальный main и применяет изменения заново. Если файлы не конфликтуют, история выглядит так, будто разработка началась от последнего состояния main.
| Команда | Назначение | Риск |
|---|---|---|
| git fetch | Получить новые данные с сервера | Изменений в рабочем дереве нет |
| git rebase main | Перенести текущую ветку на локальный main | Коммиты получат новые идентификаторы |
| git rebase origin/main | Перенести на удаленную ветку | Нужно сначала проверить fetch |
| git rebase —abort | Отменить незавершенный rebase | Возвращает состояние до операции |

Подготовка перед операцией
Сначала убедитесь, что нет незакоммиченных изменений. Выполните git status и сохраните работу коммитом или временно уберите ее через stash. Затем получите свежие данные командой git fetch origin. Просмотрите последние коммиты и убедитесь, что находитесь в нужной ветке.
git status
git switch feature/login
git fetch origin
git log --oneline --decorate -8
- Рабочее дерево должно быть чистым.
- Ветка назначения должна быть известна и актуальна.
- Локальные коммиты должны быть отделены от чужих изменений.
- Перед рисковой операцией создайте резервный указатель ветки.
Обычный сценарий rebase
Для обновления feature-ветки относительно удаленного main используйте последовательность:
git switch feature/login
git fetch origin
git rebase origin/main
Если конфликтов нет, Git завершит операцию автоматически. Проверьте историю и тесты, затем отправьте ветку на сервер. Поскольку хеши коммитов изменились, обычный push может быть отклонен. Для личной ветки используйте безопасный вариант принудительной отправки:
git push --force-with-lease origin feature/login
Опция force-with-lease проверяет, что удаленная ветка не получила чужих изменений после вашего последнего обновления. Она безопаснее безусловного --force, но все равно требует понимания, кому принадлежит ветка.
Как решать конфликты
При конфликте Git остановится и покажет файлы, которые нужно исправить. Откройте каждый файл, выберите корректный вариант, удалите маркеры конфликта и выполните тесты. После этого добавьте исправленный файл в индекс и продолжите:
git add path/to/file
git rebase --continue
Если конфликт повторяется в нескольких коммитах, разбирайте его по смыслу каждого изменения, а не копируйте один вариант вслепую. Команда git rebase --skip пропускает текущий коммит и применяется только когда вы уверены, что его содержимое уже вошло в базу.

Как отменить rebase
Если стало понятно, что выбрана не та база или конфликтов слишком много, выполните git rebase --abort. Git вернет состояние до начала операции. Если rebase уже завершен, найдите прежний указатель через reflog и создайте от него временную ветку:
git reflog
git branch rescue HEAD@{3}
Номер записи в reflog зависит от истории, поэтому перед перемещением указателей внимательно проверьте дату и сообщение коммита. Не удаляйте резервную ветку, пока новая история не прошла тесты и ревью.
Интерактивный rebase
Интерактивный режим помогает объединить мелкие коммиты, изменить порядок и отредактировать сообщение. Запустите git rebase -i origin/main, затем используйте действия pick, reword, squash и fixup. Сохраняйте смысловые границы: коммит, который нельзя собрать или проверить отдельно, усложняет ревью.
- reword меняет только сообщение коммита.
- squash объединяет изменения и предлагает объединить сообщения.
- fixup объединяет изменения без сохранения отдельного сообщения.
- edit останавливает rebase для дополнительного исправления.
Правила для команды
Зафиксируйте в проекте, какие ветки можно переписывать и когда требуется pull request. Не делайте rebase общей ветки во время активной работы команды. Перед force-with-lease сообщите коллегам, что история изменится, и проверьте статус удаленной ветки.
Чек-лист
- Сохранить локальные изменения и проверить git status.
- Сделать fetch и выбрать актуальную базу.
- Создать резервный указатель при сомнениях.
- Выполнить rebase и разрешить конфликты по одному.
- Запустить тесты и проверить итоговую историю.
- Отправить личную ветку через force-with-lease после согласования.
Rebase удобен для аккуратной истории и подготовки feature-ветки к ревью. Его сила раскрывается вместе с дисциплиной: чистое рабочее дерево, свежая база, резервный указатель и понятные правила команды.