git pull VS git fetch git rebase - PullRequest
       113

git pull VS git fetch git rebase

280 голосов
/ 29 июля 2010

Другой вопрос сказал git pull как git fetch + git merge.

Но в чем разница между git pull VS git fetch + git rebase?

Ответы [ 2 ]

328 голосов
/ 29 июля 2010

Из вашего вопроса должно быть совершенно очевидно, что вы на самом деле просто спрашиваете о разнице между git merge и git rebase.

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

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

Если вы объединяетесь в этот момент (стандартное поведение git pull), предполагая, что нет никаких конфликтов, вы получите следующее:

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

Если, с другой стороны, вы сделали соответствующую перебазировку, вы бы получили:

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

Содержимое вашего рабочего дерева должно быть одинаковым в обоих случаях; Вы только что создали другую историю, ведущую к ней . Перебазирование переписывает вашу историю, создавая впечатление, что вы зафиксировали ее поверх новой главной ветки источника (R) вместо того, где вы изначально зафиксировали (H). Вы никогда не должны использовать подход rebase, если кто-то уже извлек из вашей основной ветки.

Наконец, обратите внимание, что вы можете настроить git pull для данной ветви на использование rebase вместо слияния, установив для параметра конфигурации branch.<name>.rebase значение true. Вы также можете сделать это для одного нажатия, используя git pull --rebase.

3 голосов
/ 12 июня 2017

TLDR:

git pull похоже на бег get fetch, затем git merge
git pull --rebase похоже на git fetch затем git rebase

В ответ на ваш первыйутверждение,

git pull похоже на git fetch + git merge.

"В режиме по умолчанию git pull является сокращением для git fetch затем git merge FETCH_HEAD "Точнее, git pull запускает git fetch с заданными параметрами и затем вызывает git merge, чтобы объединить найденные головки веток с текущей веткой"

(Ref: https://git -scm.com / docs / git-pull )


Для вашего второго утверждения / вопроса:

'Но в чем разница между git pull VS git fetch + git rebase'

Опять из того же источника:
git pull --rebase

«С помощью --rebase он запускает git rebase вместо git merge.»


Теперь, если вы хотите спросить

'разница между merge и rebase'

, на которую также дан ответ:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(разница между изменением способа записи истории версий и тем, что нет)

...