git rebase
Тема дорожной карты · Изучи Git
git rebase <base> снимает коммиты текущей ветки и переигрывает их поверх <base>, давая линейную историю. Эта команда особенно полезна для поддержания чистой и линейной истории коммитов, что упрощает понимание изменений и работу с ветками. Интерактивный режим (-i) позволяет переставлять, схлопывать (squash/fixup), править или выбрасывать коммиты — это крайне ценно перед открытием Pull Request. «Золотое правило»: не делайте rebase коммитам, ушедшим за пределы вашей машины — rebase меняет SHA и ломает всех, кто отслеживает ветку. --onto пригодится для точечного переноса между базами. Если конфликты идут лавиной, git rebase --abort всё откатит, --continue продолжит после правок.
Как это работает
git rebase переписывает историю ветки, переигрывая коммиты на новую базу. Когда вы выполняете команду git rebase main, Git берёт все коммиты из вашей текущей ветки и переигрывает их поверх текущего коммита основной ветки (main). Это позволяет получить линейную историю коммитов без дополнительных коммитов слияния, что делает историю более чистой и понятной. Интерактивный режим rebase (git rebase -i) позволяет не только переиграть коммиты, но и выполнить различные действия с ними, такие как схлопывание (squash), редактирование (edit), перестановка (reorder) и удаление (drop) коммитов. Этот режим особенно полезен для подготовки истории коммитов перед пушем в удалённый репозиторий.
Когда применять
git rebase особенно полезен для локальных веток перед открытием Pull Request. Применение git rebase на локальной ветке перед тем, как отправить изменения в удалённый репозиторий, позволяет получить более линейную и чистую историю коммитов. Это уменьшает количество коммитов слияния, что делает историю более понятной и удобной для других разработчиков. Кроме того, интерактивный режим rebase (git rebase -i) позволяет схлопывать WIP-коммиты и улучшать сообщения к ним перед отправкой (push). Если ветка уже была запушена, можно использовать опцию --force-with-lease, чтобы переписать историю ветки без потери работы других разработчиков. Однако, никогда не следует применять git rebase к общим веткам, таким как main, develop или любые другие общие ветки, которые используются другими разработчиками.
Типичные ошибки
Одним из наиболее распространённых недоразумений при использовании git rebase является попытка переписать историю общих веток и force-push (git push --force). Такое действие может привести к тому, что все клоны репозитория, которые используют эту общую ветку, будут ломаться. Другой распространённой ошибкой является использование интерактивного режима rebase и разрешение конфликтов на каждом шаге. Если цепочка конфликтов становится слишком длинной, иногда проще использовать git merge вместо git rebase. Наконец, одна из самых распространённых ошибок — потеря коммитов в путанице rebase. Если вы случайно удалили или переписали коммиты, вы всегда можете восстановить их с помощью git reflog.