9

我的理解一直是它git pull本质上是和的组合,git fetchgit merge ...我在拉动时遇到过很多次,然后比较显示不属于我的更改,直到我也进行提取:

(在分支 blob 上):

git pull origin blob
git diff origin/blob  <- shows a bunch of changes that aren't from my but were just pulled from others
git fetch
git diff origin/blob  <- shows just my changes

我对拉的理解不正确吗?

4

1 回答 1

17

这是一个常见的混淆来源,以至于#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 clonegit checkout尝试自动设置它们),您可以git pull或者git pull origin它会获取所有内容,然后合并与您当前签出的分支相对应的分支。如果您想要更明确的控制,请使用git fetch然后git merge. git pull <remote> <branch>很少是你想要的。

git fetch在您的示例中修复问题的原因是,在拉取之后,您的本地分支已使用最新的远程提交更新,但跟踪分支尚未更新。git fetch使用这些提交更新跟踪分支,此时差异重新开始有意义。)

于 2013-09-20T19:19:28.470 回答