Skip to main content

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

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

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

Предупреждение

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

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

pick 1fc6c95  A
pick 6b2481b  B
pick dd1475d something I want to split
pick c619268 A fix for  B
pick fa39187 something to add to  A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before  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 оказывает некоторую помощь, сообщая команды, которые доступны при перемещении фиксаций между ветвями.