Git 为什么它会说“什么?”;您的分支机构比原始/主分支机构提前857次提交”;当我需要*拉*原点母版时

Git 为什么它会说“什么?”;您的分支机构比原始/主分支机构提前857次提交”;当我需要*拉*原点母版时,git,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. 在现有的问题

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

没有一个(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拉取origin master
,然后在本地对其进行一些操作。(或者可能只是
git fetch origin
?)

我的问题是。。。您的分支比“origin/master”提前了857次提交。这样的话,消息的措辞是否合理

因为我现在理解它的方式,意思与信息所说的相反(“我的分支”在origin/master后面)

或者它真的意味着:“远程主分支的负责人在本地源/主跟踪分支之前”

更新 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

你想得太多了。信息并不是说遥控器在后面。这意味着您的本地存储库记录的对“origin/master”的提交是。在生成该消息时,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日志
。寻找一些你不期望的最近的东西。下载或使用
gitk
获取提交历史记录的可视化图形。很可能您在“master”上签出时意外发出了git pull stable。或者类似的东西。

git-rebase-p


它会说:
首先,倒回头部,在上面重放你的工作…
然后你就一切就绪了,因为没有工作要重放。

我也有这个问题。我搜索了一下,发现我们偶尔会运行“git pull upstream master”(git pull upstream master),以获取从上游master到本地master(一个分叉分支)的最新更改。然而,这些更新的更改还没有推送到我们的远程主机上。因此,消息说“我们的本地用户比远程主机提前提交”。在分叉分支环境中继续执行新代码或修改之前,最好运行以下命令

git checkout master_分行
git-pull上游主机

git push

最后,针对问题的实际解决方案用于纠正问题:

这是因为它在合并后需要git推送。这也发生在我身上,同样的错误信息。安迪·马贡(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

我也有同样的问题。正如前面指出的,我认为问题在于原点/主指针已过时。我通常只做
git拉取原始主机
,而不做
fetch

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

git reset --hard origin/master
git fetch origin
git pull origin master
希望这对将来的人也有帮助

编辑:也很有用 在另一个问题上,我发现了一个非常有用的命令。这些都对我有用,但上面没有

如果在执行git pull远程分支后收到此消息,请重试 接着是一个
git fetch
。(可选地,运行
git fetch-p
to 从回购协议中删除已删除的分支)

Fetch似乎在更新远程分支的本地表示形式, 当您执行
git pull远程分支时,不一定会发生这种情况


如果git真的对你撒谎,说你的本地回购比你设置为远程“源”的任何回购都提前了857次提交,那么你链接的问题都不会对你有帮助,但这也可能意味着你安装了一些严重损坏的git。这似乎不太可能。你为什么不
git fetch
自己检查一下,而不是猜测一下呢?也许有人做了一个非向前推的动作。问题是。。。有人搞砸了repo,或者你的克隆人搞砸了,或者你发现了一个bug(但这很少见,我总是倾向于先责怪用户)。Git没有对你“撒谎”,你真的比origin/master提前了857次提交,或者你的repo是认真的