git rebase
git rebase: повторно застосувати коміти однієї гілки поверх іншої гілки.
Команда git rebase переміщує або об'єднує послідовність комітів, ставлячи їх на новий базовий коміт. На відміну від git merge, яка створює коміт злиття, щоб об'єднати дві гілки, ребейз бере коміти з поточної гілки та повторно застосовує їх поверх іншої гілки, створюючи лінійну історію комітів.
Ребейз (англ. rebase означає змінити базу, перебазуватися) особливо корисний, коли хочеться тримати історію проєкту чистою та лінійною. Замість «салату з комітів», де коміти з різних гілок перемішані між собою, ребейз робить так, ніби твої коміти було створено прямо поверх найсвіжіших змін цільової гілки.
Є два основні типи ребейзу:
-
Звичайний ребейз (за замовчуванням):
- Знайти спільний коміт-предок поточної гілки та цільової гілки.
- Тимчасово зберегти коміти, які є лише в поточній гілці.
- Перемістити вказівник поточної гілки на останній коміт цільової гілки.
- Один за одним повторно застосувати збережені коміти поверх останнього коміту цільової гілки.
Фактично все виглядає так, ніби гілка була створена від останнього коміту цільової гілки, а не від того коміту в минулому, де вона відгалузилася насправді.
-
Інтерактивний ребейз (
git rebase -i): відкриває інтерфейс, у якому під час ребейзу можна редагувати коміти, міняти їх місцями, об'єднувати (squash) або видаляти. Мабуть, найпотужніша можливість Git.
Ребейз переписує історію комітів: він створює нові коміти з тими самими змінами, але з іншими хешами комітів. Тому ніколи не запускай ребейз для комітів, які вже потрапили до інших людей: це може заплутати колег і створити конфлікти.
Пулл із ребейзом
За замовчуванням git pull — це фактично комбінація git fetch і git merge. Крок злиття може створити в поточній гілці нікому не потрібний коміт злиття. Зроби так кілька разів, поки працюєш над новою функцією, і отримаєш захаращену історію комітів, через яку фінальне злиття стане особливо болючим.
Насправді хочеться забрати останні зміни з віддаленої гілки й покласти всі свої свіжі коміти поверх них. Саме це робить git pull --rebase.
Але щоразу додавати цю опцію набридає, тож можна через git config зробити так, щоб git pull використовував git 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