23

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

他们(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.使其真正有意义?

因为我目前理解它的方式与消息所说的相反(“我的分支”在原点/主控后面)。

还是真的意味着:“远程主分支的 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
4

5 回答 5

27

你想多了。该消息并不是说遥控器落后了。这是说您的本地存储库记录的“origin/master”提交是。在生成该消息的任何时候,git 都没有与远程通信。它只是查看 .git 目录,然后返回 .git 的内容.git/refs/remotes/origin/master。自己试试。这两个命令都应该从存储库的顶层返回相同的内容:

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

第二个命令只是一个用于查找“原点/主”指针的管道命令。您可以用任何分支替换 'origin/master' 以获得该分支上的最新提交。

该消息告诉您,您的本地 'master' 比 'git rev-parse origin/master' 返回的提交领先 857 次提交。这种情况是如何产生的?我不能确切地说,但我会在你不小心将不同的分支合并到“master”中投入大量资金。每次我看到这个问题,它都是来自用户错误的错误合并。

首先,发出git fetch origin以确保'origin/master'指针是最新的。然后,研究你的git log. 寻找你没想到的最近的东西。下载tig 之类的程序或用于gitk获取提交历史的可视化图表。这是一个很好的赌注,您git pull stable在“master”结账时意外发出。或类似的东西。

于 2012-06-14T15:19:49.037 回答
5

git rebase -p

它会说First, rewinding head to replay your work on top of it...,你会准备好,因为没有工作可以重播。

于 2013-02-05T20:14:22.533 回答
2

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

git checkout master_branch;
git pull 上游主机;
git 推送

于 2015-12-24T20:49:50.940 回答
2

我遇到过同样的问题。就像选择的解决方案指出的那样,我认为问题在于源/主指针已过时。我大多只做git pull origin master而不做fetch

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

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

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

编辑:也很有用另一个问题上,我找到了一个很好的解决方案,其中包含有用的命令。当以上没有时,这些对我有用!

如果您在执行 a 后收到此消息git pull remote branch,请尝试使用 a 跟进它 git fetch。(可选地,运行git fetch -p以从 repo 中修剪已删除的分支)

Fetch 似乎更新了远程分支的本地表示,当您执行git pull remote branch.

于 2019-04-22T17:42:21.340 回答
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
于 2016-05-21T18:46:56.863 回答