Как правило, команда git rebase используется в следующих целях:
- изменение предыдущих сообщений о фиксациях;
- объединение нескольких фиксаций в одну;
- удаление или отмена фиксаций, которые больше не нужны.
Предупреждение
Так как изменение журнала фиксации может затруднить все остальные пользователи, использующие репозиторий, рекомендуется перебазировать фиксации при отправке в репозиторий. Сведения о том, как безопасно перебазировать, см. в разделе Сведения о слиянии запросов на вытягивание.
Перемещение фиксаций между ветвями
Чтобы переместить все фиксации между другой ветвью и текущей, в оболочке (командной строке в Windows или терминале в MacOS и Linux) можно ввести следующую команду:
git rebase --interactive OTHER-BRANCH-NAME
Перемещение фиксаций на момент времени
Чтобы переместить последние несколько фиксаций в текущей ветви, в оболочке можно ввести следующую команду:
git rebase --interactive HEAD~7
Команды, доступные при перемещении изменений между ветвями
При перемещении изменений между ветвями доступны шесть команд.
pickpickпросто означает, что фиксация включается. Изменение порядка командpickизменяет порядок фиксаций при перемещении изменений из одной ветви в другую. Если вы решили не включать фиксацию, удалите всю строку.reword- Команда
rewordаналогична командеpick, но после ее использования процесс перемещения изменений из одной ветви в другую приостанавливается, что дает возможность изменить сообщение о фиксации. Любые изменения, внесенные фиксацией, не затрагиваются. edit- Если вы решили применить к фиксации команду
edit, то получите возможность добавить фиксацию или изменить ее полностью. Вы также можете создать дополнительные фиксации, прежде чем продолжать перемещение изменений из одной ветви в другую. Это позволяет разделить большую фиксацию на меньшие или удалить ошибочные изменения, внесенные в фиксации. squash- Эта команда позволяет объединить две или более фиксаций в одну. Фиксация вносится в вышестоящую. GIT дает возможность написать новое сообщение о фиксации с описанием обоих изменений.
fixup- Эта команда похожа на
squash, но сообщение подлежащей слиянию фиксации удаляется. Фиксация просто объединяется с вышестоящей фиксацией, сообщение которой используется для описания обоих изменений. exec- Позволяет выполнять произвольные команды оболочки применительно к фиксации.
Пример использования git rebase
Независимо от используемой команды GIT запустит текстовый редактор по умолчанию и откроет файл с подробными сведениями о фиксациях в выбранном диапазоне. Этот файл выглядит примерно так:
pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Последовательно разобрав эти сведения, можно прийти к следующим выводам:
- Перечислены семь фиксаций, то есть между отправной точкой и текущим состоянием ветви произошло семь изменений.
- Фиксации, выбранные для перемещения, отсортированы в порядке от самых старых изменений (вверху) до самых новых (внизу).
- Каждая строка содержит команду (по умолчанию
pick), SHA фиксации и сообщение о фиксации. Процедураgit rebaseсосредоточена на операциях с этими тремя столбцами. Внесенные изменения перемещаются в ваш репозиторий. - После завершения фиксаций GIT сообщает диапазон фиксаций, с которыми ведется работа (
41a72e6..7b36971). - Наконец, GIT оказывает некоторую помощь, сообщая команды, которые доступны при перемещении фиксаций между ветвями.
Дополнительные материалы
- Перемещений изменений из одной ветви в другую в GIT в командной строке
- Глава "Ветвление Git" из книги Pro Git
- Глава "Интерактивное перемещение изменений из одной ветви в другую" из книги Pro Git
- Фиксации скваширования с повторной базой
- Синхронизация ветви в GitHub Desktop в документации по GitHub Desktop