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

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

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

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

> \[!WARNING]
> Так как изменение журнала фиксации может затруднить все остальные пользователи, использующие репозиторий, рекомендуется перебазировать фиксации при отправке в репозиторий. Сведения о том, как безопасно перебазировать, см. в разделе [Слияние запросов на вытягивание](/ru/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges).

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

Чтобы перебазировать все коммиты между другой ветвью и текущим состоянием ветки, вы можете ввести следующую команду в оболочке (либо в командной строке Windows, либо в терминале для Mac и Linux):

```shell
git rebase --interactive OTHER-BRANCH-NAME
```

## Перемещение фиксаций на момент времени

Чтобы переместить последние несколько фиксаций в текущей ветви, в оболочке можно ввести следующую команду:

```shell
git rebase --interactive HEAD~7
```

## Команды, доступные при перемещении изменений между ветвями

При перемещении изменений между ветвями доступны шесть команд.

<dl>
<dt><code>pick</code></dt>
<dd>
<code>pick</code> просто означает, что фиксация включается. Изменение порядка команд <code>pick</code> изменяет порядок фиксаций при перемещении изменений из одной ветви в другую. Если вы решили не включать фиксацию, удалите всю строку. </dd>

<dt><code>reword</code></dt>
<dd>Команда <code>reword</code> аналогична команде <code>pick</code>, но после ее использования процесс перемещения изменений из одной ветви в другую приостанавливается, что дает возможность изменить сообщение о фиксации. Любые изменения, внесенные фиксацией, не затрагиваются. </dd>

<dt><code>edit</code></dt>
<dd>Если вы решили применить к фиксации команду <code>edit</code>, то получите возможность добавить фиксацию или изменить ее полностью. Вы также можете создать дополнительные фиксации, прежде чем продолжать перемещение изменений из одной ветви в другую. Это позволяет разделить большую фиксацию на меньшие или удалить ошибочные изменения, внесенные в фиксации. </dd>

<dt><code>squash</code></dt>
<dd>Эта команда позволяет объединить две или более фиксаций в одну. Фиксация вносится в вышестоящую. GIT дает возможность написать новое сообщение о фиксации с описанием обоих изменений.</dd>

<dt><code>fixup</code></dt>
<dd>Эта команда похожа на <code>squash</code>, но сообщение подлежащей слиянию фиксации удаляется. Фиксация просто объединяется с вышестоящей фиксацией, сообщение которой используется для описания обоих изменений.</dd>

<dt><code>exec</code></dt>
<dd>Позволяет выполнять произвольные команды оболочки применительно к фиксации.</dd>
</dl>

## Пример использования `git rebase`

Независимо от используемой команды GIT запустит [текстовый редактор по умолчанию](/ru/enterprise-server@3.22/get-started/git-basics/associating-text-editors-with-git) и откроет файл с подробными сведениями о фиксациях в выбранном диапазоне. Этот файл выглядит примерно так:

```text
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 в командной строке](/ru/enterprise-server@3.22/get-started/using-git/using-git-rebase-on-the-command-line)
* [Глава "Ветвление Git" из книги *Pro Git*](https://git-scm.com/book/en/v2/Git-Branching-Rebasing)
* [Глава "Интерактивное перемещение изменений из одной ветви в другую" из книги *Pro Git*](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#_changing_multiple)
* [Фиксации скваширования с повторной базой](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)
* [Синхронизация ветви в GitHub Desktop](/ru/desktop/working-with-your-remote-repository-on-github-or-github-enterprise/syncing-your-branch-in-github-desktop) в документации по GitHub Desktop