git rebase
git rebase: применить коммиты одной ветки поверх другой.
Команда git rebase используется для перемещения или объединения цепочки коммитов на новый базовый коммит. В отличие от git merge, который создаёт коммит слияния для объединения двух веток, ребейз берёт коммиты из текущей ветки и «проигрывает» их поверх другой, создавая линейную историю.
Ребейз (англ. rebase — сменить базу) особенно полезен для поддержания чистой линейной истории проекта. Вместо «салата из коммитов», где коммиты из разных веток перемешаны друг с другом, ребейз делает историю такой, будто новая возможность разрабатывалась прямо поверх последних изменений целевой ветки.
Есть два основных вида ребейза:
-
Обычный ребейз (по умолчанию):
- Ищет общего предка между текущей и целевой веткой.
- Временно сохраняет коммиты, уникальные для текущей ветки.
- Перемещает указатель текущей ветки на последний коммит целевой ветки.
- По одному применяет сохранённые коммиты поверх нового состояния.
По сути, это выглядит так, будто ветка отпочковалась от последнего коммита целевой ветки, а не от старого коммита в прошлом.
-
Интерактивный ребейз (
git rebase -i): открывает интерфейс, в котором можно редактировать, менять местами, объединять (squash) или удалять коммиты прямо в процессе ребейза. Пожалуй, самая мощная фишка Git.
Ребейз переписывает историю, создавая новые коммиты с теми же изменениями, но с другими хешами. Это значит, что ни в коем случае нельзя ребейзить коммиты, которые уже были отправлены на сервер и доступны другим — это вызовет путаницу и конфликты у коллег.
Pull через rebase
По умолчанию команда git pull работает как комбинация git fetch и git merge. При этом шаг слияния может создать бесполезный коммит слияния в текущей ветке. Если сделать так несколько раз в процессе разработки новой возможности, история коммитов превратится в месиво, что сильно усложнит финальный мердж.
Вместо этого лучше взять свежие изменения из удалённой ветки и положить все свои недавние коммиты поверх них. Это делается командой git pull --rebase.
Но каждый раз дописывать этот флаг лень, поэтому можно настроить pull через rebase как поведение по умолчанию для репозитория:
git config pull.rebase trueПримеры
(полезно, когда находишься в ветке для задачи или любой другой неосновной ветке) Сделать ребейз текущей ветки на main:
git rebase mainЗапустить интерактивный ребейз для последних 3 коммитов (например, чтобы поменять их местами или слить в один):
git rebase -i HEAD~3Продолжить ребейз после разрешения конфликтов слияния:
git add .git rebase --continue
Прервать ребейз и вернуть всё в исходное состояние:
git rebase --abortОбновить текущую ветку свежими изменениями из main (взять удалённую ветку main и положить поверх неё все свои коммиты):
git fetch origingit rebase origin/main
Сделать ребейз поведением по умолчанию для git pull:
git config pull.rebase true.gitignoregit checkoutgit configgit taggit worktree