Skip to main content

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

SRC: 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 невозможно объединить коммиты