Как перебазирование может имитировать ускоренную перемотку при слиянии без ускоренной перемотки? - PullRequest
2 голосов
/ 14 июня 2019

Документация bitbucket гласит:

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

Допустим, у нас есть слияние без ускоренной перемотки вперед:

- o - o - o - H - A - B - C   <-- master (HEAD)
               \
                P - Q - R   <-- origin/master

В соответствии с приведенной выше цитатой из документации bitbucketПеребазировка может имитировать ускоренную перемотку вперед.Однако, выполнив команды:

git checkout master
git pull --rebase

git rebase, который вызывается git pull --rebase, просто получает коммиты в мастере ветки, который был извлечен, и добавляет их в новую базу, которая является origin / master, в результате чего:

- o - o - o - H - P - Q - R - A' - B' - C'   <-- master (HEAD)
                          |
                          <-- origin/master

Быстрая перемотка вперед (когда это возможно) быстрой перемотки вперед (т. е. перемещение во времени) указателя главной ветви, указывающего на последний коммит ветви, которая должна быть объединена.Тем не менее, как показано на 2-м коммите, перебазирование приводит к тому, что HEAD имеет значение C', что не совпадает с ускоренной перемоткой вперед, потому что, как показано на 2-м коммите, перебазирование создает 3 новых коммита A', B' и * 1023.* вместо быстрой пересылки указателя главной ветви, чтобы соответствовать коммитам, которые были объединены (быстрая перемотка заставила бы HEAD быть в R).

Так как git rebase может имитировать ускоренную пересылку при слиянии без ускоренной перемотки или это утверждение из документации по битовой корзине неверно?

1 Ответ

1 голос
/ 14 июня 2019

То, что будет похоже на «ускоренную перемотку вперед» (после перебазировки), это «git push»: origin/master будет просто обновлено до master коммитов локально и на удаленной стороне.
(Предполагается, что нетдругие коммиты в это время были выдвинуты кем-то еще до origin

- o - o - o - H - P - Q - R - A' - B' - C'   <-- master (HEAD)
                          |
                          <-- origin/master

git push

- o - o - o - H - P - Q - R - A' - B' - C'   <-- master (HEAD), origin/master

ТАК * конечный результат перебазировки + толчка будет таким же, как слияние с ускоренной перемоткой вперед, гдемастер был бы позади origin / master

- o - o - o - H - P - Q - R - A' - B' - C'   <-- origin/master
                          |
                          <-- master (HEAD)

git pull: fetch + fast-forward merge 

- o - o - o - H - P - Q - R - A' - B' - C'   <-- master (HEAD), origin/master
...