В чем разница между git rebase и git merge?

Подскажите, пожалуйста, какая существенная разница между merge и rebase. Почитала ответ по этой ссылке и единственное, что поняла - это то, что rebase может менять(меняет коммит), а merge создает новый, поэтому при просмотре истории более достоверная информация будет, если выполнять git merge. Тогда зачем вообще есть такая команда, как git rebase. Также при упоминании rebase, всегда упоминается линейность истории, так вот а что происходит при merge?


Ответы (4 шт):

Автор решения: Sergei Kirjanov

rebase нужен для порядка (линейность истории), чтоб потом смотреть и понимать. rebase переносит коммиты поверх того, что было в результирующей ветке. merge оставляет коммиты, как есть, просто добавляя связующий коммит между ветками.

Тут целая книга: https://git-scm.com/book/ru/v2

→ Ссылка
Автор решения: AlexGlebe

merge создаёт коммит слияния. И после merge остаются три удобных коммита. Чтобы продолжить используя только первую нить, только вторую нить, или все вместе.

коммит A ->
           |-> merge коммит C
коммит B ->

По сути merge создаёт историю.

А rebase меняет свою историю. Допустим вы написали свою работа D используя только видимую ветку коммит A.

         > работа D 
        /
коммит A ->
           |-> merge коммит C
коммит B ->

но передумали и перенесли всю свою работу в появившуюся ветку коммит B. И сделали rebase на коммит B :

коммит A ->
           |-> merge коммит C
коммит B ->
        \
         > работа D

или после rebase на коммит С :

коммит A ->
           |-> merge коммит C -> работа D
коммит B ->

rebase используют если хотят продолжить работу основываясь от чьей-то работы другого человека. Все коммиты вашей ветки работа D это новые коммиты, всё переписывается по-новой и забывается всё старое.

Линейность это то, что ваша работа D использует всё, что видно (A,B,C). Если использовать merge вместо rebase получится такой граф :

         > работа D             -> \
        /                           |-> merge D & C
коммит A ->                        / 
           |-> merge коммит C   -> 
коммит B ->

И есть возможность продолжать вашу ветку как без слияния так и с ним. rebase имеет разрушительное действие для истории. Если вы передумали пользоваться коммитом C то прийдется опять делать rebase.

→ Ссылка
Автор решения: Александр Бройко

merge добавляет коммит мержа и сохраняет историю коммитов
rebase применяет все коммиты на целевую ветку и удаляет историю коммитов

→ Ссылка
Автор решения: A B

merge - оставляет историю (больше коммитов, после merge - новый коммит слияния в основной ветке, другая продолжает существовать и не зависит от основной)

rebase - переписывает историю (меньше коммитов, после rebase последний коммит перезаписывается и остаётся основным. Ветка, которая была родительской - удаляется).

→ Ссылка