【问题标题】:Is git pull really same as git fetch+merge?git pull 真的和 git fetch+merge 一样吗?
【发布时间】:2020-01-31 09:00:08
【问题描述】:

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

【问题讨论】:

  • 这对我来说似乎无法重现。 git pull 应该已经更新了您所在的任何分支。你能告诉我们你在做什么吗?

标签: git fetch branch pull


【解决方案1】:

简短的回答是“是”,但冗长的回答只是大部分“是”。

如果您的 Git 版本早于 2.6,则您的 git pull 很简单——好吧,也许没那么简单,超过 300 行——shell script runs this line:

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 上更快,因为它不再需要涉及 shell。

答案只有大部分“是”的部分是获取之后,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 获取。

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 2020-07-27
    • 2015-02-19
    • 2011-02-05
    • 2017-03-28
    • 1970-01-01
    • 2014-03-12
    • 2014-09-08
    • 2017-08-13
    相关资源
    最近更新 更多