Skip to main content

О перемещении изменений между ветвями в Git

Команда git rebase позволяет легко изменить ряд фиксаций, изменив журнал репозитория. Вы можете переупорядочивать, изменять фиксации или выполнять их сжатие.

Как правило, команда git rebase используется в следующих целях:

  • изменение предыдущих сообщений о фиксациях;
  • объединение нескольких фиксаций в одну;
  • удаление или отмена фиксаций, которые больше не нужны.

Предупреждение. Так как изменение журнала фиксаций может затруднить работу всех остальных пользователей репозитория, перемещать фиксации из одной ветви в другую после отправки в репозиторий не рекомендуется. Чтобы узнать, как безопасно перебазировать данные GitHub.com, см. раздел "Сведения о слиянии запросов на вытягивание".

Перемещение фиксаций между ветвями

Чтобы переместить все фиксации между другой ветвью и текущей, в оболочке (командной строке в 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 оказывает некоторую помощь, сообщая команды, которые доступны при перемещении фиксаций между ветвями.

Дополнительные материалы