pull-only repo的'git status'表示分支领先于origin / master。为什么?

时间:2011-09-09 17:43:12

标签: git branch git-push git-pull git-fetch

所以情况如下:

  

$ git status
  #在分公司主人上   #[x]提交你的分支领先于'origin / master'   #

关于SO的问题已有几个问题,但似乎没有一个问题专门针对我所拥有的场景类型。 This answer其中一个问题最接近,但没有详细说明。

我会直接引用它:

  

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

     

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

这个提示确实有效。但“不一定会发生吗?”为什么不?我需要了解这一点。什么拉不做?

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

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

我只在Mac上提交和git push origin master。作为正常工作流程的一部分,在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

5 个答案:

答案 0 :(得分:9)

好的,从一开始,你就是在做正确的事。我认为您之前添加的评论是一个非常好的解释:

  

用最简单的术语来说,“git pull”执行“git fetch”后跟a   “git merge”

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

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

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

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

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

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


这是另一个有趣的问题:

Having a hard time understanding git-fetch


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

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

ORIG_HEAD

FETCH_HEAD

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

注意:该问题是最近与Git: unable to get remote and local/server the same的链接。请注意,原始问题的日期为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。这就是这个谜题的真正解释。

答案 3 :(得分:1)

请参阅此问题:What is the difference between 'git pull' and '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/

答案 4 :(得分:0)

在我的情况下 - 我在Origin有两个分支,每次我拉一个git pull它表明我在x之前领先于origin / master。即使在将其重新设置为原始/主人之后,如Reset local repository branch to be just like remote repository HEAD所示。

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