Команди Git

git rebase

git rebase: повторно застосувати коміти однієї гілки поверх іншої гілки.

Команда git rebase переміщує або об'єднує послідовність комітів, ставлячи їх на новий базовий коміт. На відміну від git merge, яка створює коміт злиття, щоб об'єднати дві гілки, ребейз бере коміти з поточної гілки та повторно застосовує їх поверх іншої гілки, створюючи лінійну історію комітів.

Ребейз (англ. rebase означає змінити базу, перебазуватися) особливо корисний, коли хочеться тримати історію проєкту чистою та лінійною. Замість «салату з комітів», де коміти з різних гілок перемішані між собою, ребейз робить так, ніби твої коміти було створено прямо поверх найсвіжіших змін цільової гілки.

GIT REBASE
1 / 37

Є два основні типи ребейзу:

  1. Звичайний ребейз (за замовчуванням):

    • Знайти спільний коміт-предок поточної гілки та цільової гілки.
    • Тимчасово зберегти коміти, які є лише в поточній гілці.
    • Перемістити вказівник поточної гілки на останній коміт цільової гілки.
    • Один за одним повторно застосувати збережені коміти поверх останнього коміту цільової гілки.

    Фактично все виглядає так, ніби гілка була створена від останнього коміту цільової гілки, а не від того коміту в минулому, де вона відгалузилася насправді.

  2. Інтерактивний ребейз (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 origin
git rebase origin/main

Зробити ребейз поведінкою за замовчуванням для git pull:

git config pull.rebase true