这是一个常见的混淆来源,以至于#gitIRC 频道有一个罐头帮助文本,称为!pull4:
我们建议不要使用 'git fetch/pull <remote> <refspec>'(即带有分支参数),因为它不会更新 <remote>/<branch> 参考。正确获取东西的简单方法是获取所有内容:如果您有一个遥控器,“git fetch”或“git pull”就足够了;否则我们推荐 'git fetch <remote>'(如果你想拉/合并,加上 'git merge <remote>/<branch>')。
这里发生的情况是,在“默认远程”(通常)上git pull没有参数的情况下,然后是与您当前本地分支相对应的远程分支。对明确指定的遥控器做同样的事情。但是,“四字拉动”将该分支提取到一个临时位置,而不更新您的跟踪分支,然后合并到您当前的分支中。git fetchorigingit mergegit pull <remote>git pull <remote> <branch>FETCH_HEADFETCH_HEAD
因此,通过使用git pull origin blob,您是在说“我想将blob远程分支的最新版本合并origin到我当前的分支中,而不更新我的任何跟踪分支或获取任何其他数据”。
如果您的分支合并配置是正确的(并且它们可能是,因为git clone并git checkout尝试自动设置它们),您可以git pull或者git pull origin它会获取所有内容,然后合并与您当前签出的分支相对应的分支。如果您想要更明确的控制,请使用git fetch然后git merge. git pull <remote> <branch>很少是你想要的。
(git fetch在您的示例中修复问题的原因是,在拉取之后,您的本地分支已使用最新的远程提交更新,但跟踪分支尚未更新。git fetch使用这些提交更新跟踪分支,此时差异重新开始有意义。)