16

所以情况如下:

$ git status
# On branch master
# 你的分支在 'origin/master' 之前 [x] 提交。
#

已经有几个关于这个的问题,但似乎没有一个专门解决我所拥有的场景类型。对其中一个问题的回答最接近,但没有详细说明。

我将逐字引用它:

如果您在执行“git pull remote branch”后收到此消息,请尝试使用“git fetch”跟进。

Fetch 似乎更新了远程分支的本地表示,当您执行“git pull remote branch”时不一定会发生这种情况。

该提示确实有效。但是“不一定会发生?” 为什么不?我需要明白这一点。什么是拉不做?

我不想接手这个问题,所以这是我的详细场景:

涉及三台计算机。我开发的 Mac,git repo(即 origin/master)所在的家庭服务器以及从该服务器提取的 Webfaction 帐户。

git push origin master只在 Mac 上提交。作为正常工作流程的一部分,在 Webfaction 上运行的唯一命令是git pull origin master(作为 Fabric 部署脚本的一部分)。我不在那里修改代码。我是一个孤独的开发者,所以其他人也不是。

我时不时地登录到 Webfaction 并检查一些东西,包括git status. 不可避免地,我总是收到“你的分支在前面......”的消息。运行git fetch使消息消失。

我即将添加git fetch到 Fabric 脚本中以解决此问题,但我想知道为什么需要这样做,尤其是在源/主的仅拉式克隆上。尽管我每天都使用基本功能,但我对 Git 的了解并不深入,因此对新手友好的解释将不胜感激。

根据要求更新,相关位来自config

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@[server_address]:[path/to/repo.git]
[branch "master"]
    remote = origin
    merge = refs/heads/master
4

5 回答 5

11

好的,所以从一开始,你做的一切都是正确的。我认为您之前添加的评论是一个很好的解释:

用最简单的术语来说,“git pull”会执行“git fetch”,然后是“git merge”

我就是这么想的。所以你不应该git fetch在直线上升之后调用 a git pull- 但是,我几乎可以向你保证,这在除了master分支之外的任何东西上都可以正常工作。

在其中一个链接的帖子中,它说要删除以下行:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/* <--- Remove this

它应该可以解决这个问题——但是,我无法解释为什么会这样。很难研究,但我认为当您调用 时fetch,您的 git 配置实际上指定了要抓取的内容。当您运行时pull,我不确定它是否认为master已同步。

我可以向您保证,如果您从另一个非主分支执行此操作,您将不会看到此问题。希望其中一位 git 大师可以fetch详细解释 config 中的这一行。

此外,我建议运行以下命令来设置远程存储库的 HEAD,以确保它与本地存储库同步:git push -u origin master


这是另一个有趣的问题:

很难理解 git-fetch


好的,所以我在我的一个工作流程中对此进行了测试,并发现了以下内容。

当您git pull origin master在远程服务器上执行 a 时,.git/目录中有一个文件引用您的 HEAD 所在的位置。需要注意的两个文件:

ORIG_HEAD

FETCH_HEAD

您会注意到您FETCH_HEAD是正确的,但ORIG_HEAD显示的是旧提交,因此您获得Ahead by x. 当您运行时git fetch,您实际上会更正参考ORIG_HEAD,一切都恢复正常。我正在研究如何更改fetch配置中的行以修复此行为。

于 2011-09-09T18:29:03.747 回答
8

如果您运行 agit pull origin而不是 a git pull origin master,则消息不会出现问题Your branch is ahead of 'origin/master' by ... commits.

于 2013-09-15T06:33:13.560 回答
2

注意:这个问题最近从Git 链接到:无法获取远程和本地/服务器相同的. 请注意,原始问题的日期是 2011 年 9 月;当时最新的 Git 版本是 1.7.10。Git 现在是 2.26.2 版本。

在 Git 1.8.4 之前的 Git 版本中,运行会git pull origin master 抑制更新本地名称origin/master。(跑步也是如此git fetch origin master。)

运行git fetch,不带额外参数,会导致所有版本的 Git(1.8.4 之前和之后)更新所有远程跟踪名称,包括origin/master. 这就是这个谜团背后的真正解释。

于 2020-05-11T19:17:16.950 回答
1

看到这个问题:'git pull'和'git fetch'有什么区别?

AFAIK git pull 将查看原点上的分支并下拉更改。但是分支的本地索引不是最新的。git fetch 将更新分支的索引,以便它了解应该存在什么。(基本上你链接到的答案中引用了什么)

我总是在 git pull 之前做一个 git fetch。真的,每当我要对远程分支做任何事情时,我都会做一个 git fetch 。

与上述问题相关的还有对 git fetch、pull 和 merge 的非常好的描述。 http://longair.net/blog/2009/04/16/git-fetch-and-merge/

于 2011-09-09T17:47:52.393 回答
0

就我而言 - 我在 Origin 有两个分支,每次我拉一个 git pull 时,它都表明我领先于 origin/master x。即使在将其硬重置为 origin/master 之后,如重置本地存储库分支中所示,就像远程存储库 HEAD 一样

当我简单地运行git fetch并将我的开发分支带到我的生产服务器时,解决方案就出现了。

于 2015-09-15T13:28:35.767 回答