首先,我知道一些措辞相似的问题,例如:
他们(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
答案 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
时不一定会发生这种情况。