当我需要* pull * origin master时,为什么它会说“你的分支在857提交之前领先于原点/主人”

时间:2012-06-14 12:03:34

标签: git

首先,我知道一些措辞相似的问题,例如:

他们(AFAICT)都没有符合我的问题版本的答案。

我的情况是:

$ git status
# On branch stable
nothing to commit (working directory clean)
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 857 commits.

在现有的问题中,接受和赞成的答案大多同意它意味着字面意思......我领先,我需要推送我的新提交到origin / master。

我知道实际情况恰恰相反,我的本地master分支位于远程origin/master后面,实际上我需要git pull origin master才能在本地进行一些工作。 (或者可能只是git fetch origin?)

我的问题是......是否有一些理由要让信息措辞Your branch is ahead of 'origin/master' by 857 commits.,使其真正有意义?

因为我现在理解它的方式与消息所说的相反('我的分支'是 origin / master之后)。

或者它的确意味着:“远程主分支的HEAD优先于您的本地原点/主跟踪分支”?

更新 FWIW我在一个由六个其他开发人员组成的团队中工作。我们每天都会多次拉,提,推等等没有问题。我这里没有错误...我只是想了解为什么Git用这种方式说出它的信息 - 措辞本身是否被错误选择,或者是否有一些Git的基本概念导致他们用这种方式来说话而且我不能正确理解。

更多信息
这是我猜可能是git config -l

输出的相关部分
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=https://code.google.com/a/google.com/p/xxxxx/
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.master.mergeoptions=--no-ff

5 个答案:

答案 0 :(得分:27)

你在想这个。消息并不是说遥控器落后了。它说你的本地存储库记录了'origin / master'的提交。在生成该消息时,git始终与远程通信。它只是查看.git目录,并返回.git/refs/remotes/origin/master的内容。亲自尝试一下。这两个命令都应该从存储库的顶层返回相同的内容:

cat .git/refs/remotes/origin/master
git rev-parse origin/master

第二个命令只是一个用于查找'origin / master'指针的管道命令。您可以将'origin / master'替换为任何分支,以获取该分支上的最新提交。

该消息告诉您,您的本地“主人”超过了由'git rev-parse origin / master'返回的提交857次提交。这种情况是怎么出现的?我不能确切地说,但是我会花很多钱在你不小心将一个不同的分支合并为“主人”。每次我看到这个问题,都是用户错误导致的错误合并。

首先,发出git fetch origin以确保'origin / master'指针是最新的。然后,研究你的git log。寻找最近你不期望的东西。下载program like tig或使用gitk获取您的提交历史记录的可视图表。你在“主人”签出时不小心发出了git pull stable这是一个不错的选择。或类似的东西。

答案 1 :(得分:5)

git rebase -p

它会说First, rewinding head to replay your work on top of it...并且你将全部设定,因为没有重播的工作。

答案 2 :(得分:1)

我也有这个问题。我搜索了一下,发现我们偶尔会运行'git pull upstream master'来获取从上游master到我们的本地master(这是一个fork分支)的最新更改。但是,这些更新的更改尚未推送到我们的远程主服务器。因此,消息显示'我们的本地是x提交远程主机'。在分叉分支环境中继续执行新代码或修改之前,最好运行以下命令

git checkout master_branch;
git pull upstream master;
git push

答案 3 :(得分:1)

最后,实际 解决方案用于解决问题的问题:

这是因为合并后需要一个git push。这也恰好发生在我身上,同样的错误信息。 Andy magoon也是对的,因为当我做推动时,我现在看到一个干净的石板,没有任何字节被推动。然而,重新定位通常不是最好的方法。

    $ git status ./
On branch master-blah1
Your branch is ahead of 'origin/master-blah1' by 869 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean


    $ git push
    Counting objects: 7, done.
    Delta compression using up to 48 threads.
    Compressing objects: 100% (7/7), done.
    Writing objects: 100% (7/7), 653 bytes | 0 bytes/s, done.
    Total 7 (delta 4), reused 0 (delta 0)

$ git status ./
On branch master-blah1
Your branch is up-to-date with 'origin/master-blah1'.
nothing to commit, working directory clean

答案 4 :(得分:1)

我有同样的问题。像chosen solution所指出的那样,我认为问题在于原点/主指针已过期。我主要只做git pull origin master,而不做fetch

由于我知道自己没有本地更改,因此我硬重置为master,然后获取以更新指针,最后将其拉出以赶上远程master分支上的提交。像这样:

git reset --hard origin/master
git fetch origin
git pull origin master

希望这对将来的人也有帮助。

编辑:也有用 在另外this个问题上,我发现了一个不错的solution,其中包含有用的命令。当上述方法不起作用时,这些对我有用!

  

如果您在执行git pull remote branch之后收到此消息,请尝试   跟上git fetch。 (或者,运行git fetch -p   从存储库中删除已删除的分支)

     

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