Git pull 不执行 git fetch



我的理解一直是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

我对拉力的理解不正确吗?

这是一个常见的混淆来源,以至于#git IRC 频道有一个预设的帮助文本,称为 !pull4

我们建议不要使用"git fetch/pull "(即带有分支参数),因为它不会更新/ ref。正确获取内容的简单方法是获取所有内容:"git fetch"或"git pull"就足够了,如果你有一个遥控器;否则,我们建议使用"git fetch "(如果你想拉取/合并,加上"git merge /")。

这里发生的事情是,没有参数git pull在"默认远程"(通常origin)上git fetch,然后git merge对应于当前本地分支的远程分支。 git pull <remote>对显式指定的远程执行相同的操作。但是,git pull <remote> <branch>"四字拉取"会将该分支提取到临时位置,FETCH_HEAD而不更新跟踪分支,然后将FETCH_HEAD合并到当前分支中。

因此,通过使用 git pull origin blob ,您是在说"我想将远程origin上最新版本的blob分支合并到我当前的分支中,而无需更新我的任何跟踪分支或获取任何其他数据"。

如果您的分支合并配置正确(它们可能是,因为git clonegit checkout尝试自动设置它们),您只需git pullgit pull origin,它将获取所有内容,然后合并与您当前签出的分支对应的分支。如果需要更明确的控制,请使用 git fetch 然后git mergegit pull <remote> <branch>很少是你想要的。

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

最新更新