Git pull - это то же самое, что git fetch + merge? - PullRequest
0 голосов
/ 02 октября 2019

Я видел так много вопросов здесь и в сети, которые говорят, что git pull - это то же самое, что делать git fetch, а затем объединять. На днях я что-то вытягивал на работе, используя git pull, и мне все время говорили, что мой локальный филиал уже обновлен, хотя другие разработчики внесли изменения. Однако, когда я сделал git fetch, а затем сделал git pull, я смог вытащить изменения. Если git pull уже делает git fetch, почему просто выполнение git pull не работает? Буду признателен за ответ.

1 Ответ

1 голос
/ 02 октября 2019

Короткий ответ «да», но длинный ответ только в основном «да».

Если ваша версия Git старше 2.6, ваша git pull простая- хорошо, хорошо, может быть, не так просто, весом более 300 строк - сценарий оболочки , который запускает эту строку :

git fetch $verbosity $progress $dry_run $recurse_submodules --update-head-ok "$@" || exit 1

Здесь $@включает в себя большинство аргументов, которые люди обычно вводят в git pull:

git pull origin master

, например, будет работать:

git fetch origin master

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

Начиная с Git версии 2.6.0, git pull теперь кодируется в C, но все равно вызывает ту же самую операцию git fetch - она ​​быстрее в Windows, чем нет. дольше нужно задействовать оболочку.

Часть, где ответ только в основном"да", состоит в том, что после выборки, оставшаяся часть git pullне обязательно git merge. Это может быть git rebase или даже в нескольких угловых случаях git read-tree. Подробности см. В остальной части сценария.

Обратите внимание, что если у вас более одного пульта и вы запускаете git fetch без дополнительных аргументов, Git будет использовать настроенный удаленный филиал текущей ветви, если он есть,или origin, если нет настроенного пульта дистанционного управления. Когда вы запускаете git pull <em>remote branch-name</em>, вы предоставляете именованный пульт, который переопределяет настроенный удаленный филиал текущей ветви (если есть). Так что это может быть источником различий: если текущая ветвь не имеет восходящего набора, git fetch будет извлекать из origin, но git pull otherremote foo будет извлекать из удаленного otherremote.

...