коммит слияния, которые произошли перед выполнением ребазинга - PullRequest
0 голосов
/ 19 сентября 2018

Скажем, я нахожусь в ветви функций , и я делаю:

git fetch origin 
git merge origin/dev

Я делаю это несколько раз, а через неделю я делаю:

git fetch origin
git rebase origin/dev

что происходит с коммитами слияния, которые я создал ранее?Их выбрасывают?Мне интересно, может ли rebase сосуществовать с объединением после факта.

(обратите внимание, что origin / dev является ветвью интеграции в этом случае).

1 Ответ

0 голосов
/ 19 сентября 2018

Без -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 коммит, и перебазирование завершено.

...