Команды Git

git rebase

git rebase: применить коммиты одной ветки поверх другой.

Команда git rebase используется для перемещения или объединения цепочки коммитов на новый базовый коммит. В отличие от git merge, который создаёт коммит слияния для объединения двух веток, ребейз берёт коммиты из текущей ветки и «проигрывает» их поверх другой, создавая линейную историю.

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

GIT REBASE
1 / 37

Есть два основных вида ребейза:

  1. Обычный ребейз (по умолчанию):

    • Ищет общего предка между текущей и целевой веткой.
    • Временно сохраняет коммиты, уникальные для текущей ветки.
    • Перемещает указатель текущей ветки на последний коммит целевой ветки.
    • По одному применяет сохранённые коммиты поверх нового состояния.

    По сути, это выглядит так, будто ветка отпочковалась от последнего коммита целевой ветки, а не от старого коммита в прошлом.

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

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

git config pull.rebase true