Без -p
или --preserve-merges
, или с опцией новомодного --rebase-merges
, git rebase
просто сбрасывает слияния.
Я говорю "просто" здесь, и "отбрасывать"коммит слияния "part прост , но общий процесс немного сложен.Ключ в том, чтобы сначала прочитать и понять веб-сайт Думайте как (а) Git , и сядьте и поработайте с кучей примеров достижимости .Нарисуйте несколько графиков, например:
G-----H R <-- tip1
/ \ /
...--F---L-----M--N--O--S <-- tip2
\ \
J---K-----------P <-- tip3
(я пропустил Q
, поскольку это выглядит слишком похоже на O
. Я пропустил I
случайно, упс. :-)) Какие коммиты достижимо с M
, или P
, или K
?Когда вы можете посмотреть на этот или какой-то другой график и быстро перечислить достижимых коммитов , вы готовы к следующему шагу.
Что git rebase
делает, это перечисляет те коммиты, которые достижимыиз HEAD
коммита исключая коммитов, достижимых от другого коммита, который вы называетеТо есть, учитывая git rebase origin/dev
, Git находит все коммиты, которые достижимы с origin/dev
.Эти коммиты исключены из ребаз, независимо от того, что еще может произойти.
Затем, с полным списком "невозможно включить эти коммиты", Git составляет список Может быть включен совершает.Это коммит HEAD
, и все коммиты достижимы из коммита HEAD
.Так, например, если мы добавим HEAD
к имени tip1
, то, возможно, включенные коммиты будут R
(с которыми tip1
баллов), O
(достижимы с R
), N
(достижимы с O
), M
(достижимы с N
), H
и L
(оба достижимы с M
), G
(достижимы с H
), F
(достижимыот L
и G
), а также от любых коммитов до F
.
Теперь, когда rebase
имеет список , возможно, включите и , безусловно, исключите , Git отбрасывает все , определенно исключающие коммиты из списка.Результатом является меньший список "может включать".На этом этапе стандартная перебазировка также отбрасывает все коммитов слияния: коммитов как минимум с двумя родителями.
Что бы не осталось, это коммиты с одним родителем,так что Git может запустить git cherry-pick
на них.Git проверяет, как отдельный HEAD, коммит --onto
или целевой коммит (origin/dev
), если вы не указали --onto
, и выбирает каждый коммит из этого списка по одному коммиту за раз.Это создает новую цепочку.Как только цепочка построена, Git перемещает старое имя ветки в новый HEAD
коммит, и перебазирование завершено.