Как правило, команда git rebase
используется в следующих целях:
- изменение предыдущих сообщений о фиксациях;
- объединение нескольких фиксаций в одну;
- удаление или отмена фиксаций, которые больше не нужны.
Warning
Так как изменение журнала фиксации может затруднить все остальные пользователи, использующие репозиторий, рекомендуется перебазировать фиксации при отправке в репозиторий. Сведения о безопасной перебазе см. в разделе "Сведения о слиянии запросов на вытягивание".
Перемещение фиксаций между ветвями
Чтобы переместить все фиксации между другой ветвью и текущей, в оболочке (командной строке в Windows или терминале в MacOS и Linux) можно ввести следующую команду:
git rebase --interactive OTHER-BRANCH-NAME
Перемещение фиксаций на момент времени
Чтобы переместить последние несколько фиксаций в текущей ветви, в оболочке можно ввести следующую команду:
git rebase --interactive HEAD~7
Команды, доступные при перемещении изменений между ветвями
При перемещении изменений между ветвями доступны шесть команд.
pick
pick
просто означает, что фиксация включается. Изменение порядка команд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
- Уплотнение фиксаций путем перемещения изменений из одной ветви в другую
- AutoTITLE в документации по GitHub Desktop