# Слияние веток (merge/rebase/fast-forward)

[SRC: https://selectel.ru/blog/tutorials/how-to-rebase-commits-and-branches/](https://selectel.ru/blog/tutorials/how-to-rebase-commits-and-branches/)

Объединить две ветки в гите можно по разному:

- rebase - создание новых, но таких же коммитов
- merge - перенос коммитов в ветку как есть, без пересоздания

Результат один и тот же - (условно) ветка master будет в нашей ветке где мы работаем. У нас будут актуальные изменения из мастера и мы не потеряем наши наработки.

**Rebase**: В этом случае **наши коммиты** будут удалены и добавлены **в конец к мастер ветке**, в отличие от merge, когда коммиты объединяются между собой. Т.е. в итоге коммиты в нашей ветке будут такие:

1. Наше изменение
2. Наше изменение
3. Наше изменение
4. Изменения из мастера
5. ...

В случае с **merge** мы получим такое:

1. Наши изменения
2. Мастер
3. Мастер
4. Наши изменения
5. Мастер
6. ...
7. Наши измезения
8. ...

Очевидно, что использовать rebase гораздо удобнее, т.к. **наши изменения будут в конце и их будет проще рассматривать,** после мержа в мастер не надо будет искать, какие изменения были внесены, они будут идти друг за другом и все будет понятно.

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

Однако у rebase есть и минусы.

- Теряется история коммитов, а именно их дата и хеши.
- Может быть переписан текст коммитов (что с одной стороны может быть полезно, в некоторых ситуациях)
- Коммиты могут быть объединены (что также может быть полезно в некоторых ситуациях). **При git merge невозможно объединить коммиты**