【问题标题】:pull-only repo's 'git status' saying the branch is ahead of origin/master. Why?pull-only repo 的 'git status' 表示分支在 origin/master 之前。为什么?
【发布时间】:2011-11-13 23:47:04
【问题描述】:

所以情况是这样的:

$ git 状态
# 在分支主
# 你的分支在 'origin/master' 之前 [x] 次提交。
#

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

我将逐字引用:

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

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

这个技巧确实有效。但是“不一定会发生?”为什么不?我需要明白这一点。 pull 不做什么?

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

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

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

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

我将在 Fabric 脚本中添加 git fetch 以解决此问题,但我想知道为什么需要这样做,尤其是在源/主的仅拉式克隆上。尽管我每天都使用基本功能,但我对 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

【问题讨论】:

  • 您能否在问题中从 Webfaction 服务器发布您的 git 配置的“来源”部分?我觉得这可能与它有关。
  • 请注意,我没有以任何方式修改该配置文件。它是使用来自原始存储库的标准 git clone 创建的。
  • 请注意,在发布此问题时,Git 的 当前 版本是 1.7.10。

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


【解决方案1】:

注意:这个问题最近链接到 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。这就是这个谜团背后的真正解释。

【讨论】:

  • 哈,过去的爆炸 :D 感谢您在这些年来清理它。我仍然很奇怪为什么会这样做,但事实就是如此。 (或者更确切地说,它就是这样......)将其切换为接受的答案。
  • 1.8.4 release notes 解释了为什么他们认为这是一个好主意,然后改变了主意。嗯,explains 太强了……至少他们认为这是个好主意。 :-)
【解决方案2】:

在我的例子中 - 我在 Origin 有两个分支,每次我拉一个 git pull 时,它都表明我比 origin/master 领先 x。即使像Reset local repository branch to be just like remote repository HEAD 中所示将其硬重置为原点/主控。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 是的,这很有趣。当我“拉出原点主人”时,它似乎只抓住原点/主人的 HEAD(` * 分支主人 -> FETCH_HEAD), but "pull origin" grabs the entire branch ( 647e59e..e1d6c02 主人 -> 原点/主人`)。
    • 这就是我需要的。谢谢!
    【解决方案4】:

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

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

    我就是这么想的。所以你不应该在直接使用git pull 之后调用git fetch - 但是,我几乎可以向你保证,除了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 行以解决此问题。

    【讨论】:

    • 标记为已接受。看看关于这个主题的其他问题,我怀疑我什至会理解任何更多的技术解释(因为除其他外,我真的不明白其他 Git 相关问题中经常提到的“refspecs”和跟踪分支实际上是什么...... .)
    • 出于某种原因,我只需要对我的主人进行 git fetch 操作。
    • 我在非主远程跟踪分支上遇到了同样的问题,并且在 git fetch 而不是 git pull 级别。 git fetch remote branch 似乎没有像这个答案所示那样更新 ORIG_HEAD,而 git fetch 确实如此。 @Nic - 您是否为配置文件找到了更好的获取行以导致长格式命令也更新 ORIG_HEAD?
    • 我的 ORIG_HEAD 和 FETCH_HEAD 都指向同一个提交,但仍然出现此错误....
    【解决方案5】:

    看到这个问题: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/

    【讨论】:

    • 对该问题的公认答案是:“用最简单的术语来说,“git pull”执行“git fetch”,然后执行“git merge”。我仍然对实际情况以及何时需要单独的 git fetch 感到困惑。
    • 混战在上面解释了这一点。我也很想知道为什么 master 分支的处理方式与其他分支不同。
    猜你喜欢
    • 2015-10-06
    • 2012-07-26
    • 2011-02-22
    • 2020-11-05
    • 2020-07-27
    • 2012-01-31
    • 2016-04-08
    • 2011-05-20
    相关资源
    最近更新 更多