> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/02-tools/git/07-rebasing.md).

# 07. Rebasing

**Перебазирование** (rebase) — это альтернатива слиянию для задач объединения нескольких веток. Если слияние создаёт новый коммит с двумя родителями, оставляя нелинейную историю, то перебазирование применяет все коммиты один за одним из одной ветки в другую, оставляя за собой линейную историю коммитов. По сути это автоматическое выполнение нескольких команд `cherry-pick` подряд.

The general process can be visualized as the following:

![alt text](https://www.atlassian.com/dam/jcr:e4a40899-636b-4988-9774-eaa8a440575b/02.svg)

From a content perspective, rebasing is changing the base of your branch from one commit to another making it appear as if you'd created your branch from a different commit. Internally, Git accomplishes this by creating new commits and applying them to the specified base. It's very important to understand that even though the branch looks the same, it's composed of entirely new commits.

### Example

![](https://1356653101-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5bu9Zoywb01ca-XJjd%2F-M6fqwLgc61kvMydwlRF%2F-M6fu9o7aVs66exQEeOj%2Fimage.png?alt=media\&token=1aed9ec9-a17e-47aa-87f1-996c68245460)

Команда берёт все коммиты, которые есть в ветке `topic`, но отсутствуют в ветке master (коммиты `169a6` and `2c33a`), и воспроизводит их в ветке `master`. Затем указатель ветки перемещается на новое место. Следует заметить, что старые коммиты будут уничтожены сборщиком мусора, если на них уже ничего не будет ссылаться.

![](https://1356653101-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5bu9Zoywb01ca-XJjd%2F-M6fqwLgc61kvMydwlRF%2F-M6fuD2qDDY4poaaCVdf%2Fimage.png?alt=media\&token=c7b1d6b8-448f-4c6b-b54e-08dea41cc106)

Используйте ключ `--onto` чтобы ограничить глубину захвата объединяемой ветки. На следующей схеме вы можете увидеть как в ветку master приходят лишь последние коммиты из текущей ветки, а именно коммиты после (но не включая) `169a6`, т. е. `2c33a`.

### Interactive rebasing

`git rebase -i` позволяет организовывать коммиты во время `rebase`. С его помощью вы сможете сбросить некоторые коммиты (`dropping`), изменить их порядок (`reordering`), выполнить правку (`modifying`), или объединение (`squashing`) коммитов.

```bash
git rebase master --autostash
```
