git pull 真的和 git fetch+merge 一样吗?



我在这里和网络上看到了很多问题,他们说 git pull 与执行 git fetch 然后合并是一回事。前几天我在工作中使用 git pull 拉取了一些东西,它一直对我说我的本地分支已经是最新的,尽管其他开发人员进行了更改。但是,当我执行 git 提取然后执行 git 拉取时,我能够提取更改。如果 git pull 已经执行了 git 提取,为什么只执行 git pull 不起作用? 我将不胜感激。

简短的回答是"是",但长答案只是大部分是"是"。

如果你的 Git 版本低于 2.6,那么你的git pull是一个简单的——好吧,好吧,也许不是那么简单,重量超过 300 行——运行以下行的 shell 脚本:

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

这里的$@包含了人们通常在git pull中输入的大多数参数:

git pull origin master

例如,将运行:

git fetch origin master

(如果适用,将从$@中删除一些选项以传递给变基或合并命令。

从 Git 版本 2.6.0 开始,git pull现在用 C 语言编码,但它仍然调用相同的git fetch操作 - 只是在 Windows 上更快,因为它不再需要涉及 shell。

答案大多是"是"的部分是,获取git pull的剩余部分不一定git merge。 它可以是git rebase,甚至可以在少数极端情况下,git read-tree. 有关详细信息,请参阅脚本的其余部分。

请注意,如果您有多个远程数据库,并且运行git fetch时没有其他参数,则 Git 将使用当前分支配置的远程(如果有(或origin(如果没有配置的远程(。 当您运行git pullremote branch-name时,您将提供一个命名的远程数据库,该远程数据库将覆盖当前分支配置的远程数据库(如果有(。 所以这可能是差异的来源:如果当前分支没有上游集,git fetch将从origin获取,但git pull otherremote foo将从远程otherremote获取。

最新更新