git:你的分支由X提交领先

问题描述 投票:338回答:18

这实际上是怎么产生的?

我现在正在自己的一个回购工作,所以这是我的工作流程:

  1. 更改文件
  2. 承诺
  3. 重复1-2直到满意为止
  4. 推送掌握

然后,当我做一个git status时,它告诉我我的分支是由X提交提前(可能是我提交的提交数量相同)。是因为当您推送代码时它实际上并不更新本地缓存的文件(在.git文件夹中)? git pull似乎'修复'这个奇怪的消息,但我仍然好奇它为什么会发生,也许我使用git错了?


包括在消息中打印的分支

我当地的分公司领先于大师

你在哪里推/拉当前分支

我正在向GitHub推送并拉到我当时正在处理的任何一台计算机,我的本地副本总是完全是最新的,因为我是唯一一个正在处理它的人。

它实际上并没有检查远程仓库

这就是我的想法,我想我会确保我对它的理解是正确的。

你传递一些额外的论据吗?

不是我能看到的,也许我的结尾有一些有趣的配置?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
git git-commit
18个回答
480
投票

如果你在做了git pull remote branch之后得到这个消息,请尝试用git fetch跟进它。 (可选地,运行git fetch -p以从repo中删除已删除的分支)

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


2
投票

它只是提醒您当前分支与执行当前轨道的分支之间的差异。请提供更多信息,包括消息中打印的分支以及您在何处推/拉当前分支。


2
投票

虽然这个问题有点陈旧......我处于类似的情况,我的回答帮助我解决了类似的问题

首先尝试使用push -f或force选项

如果这不起作用,则可能(在我的情况下)远程存储库(或者更确切地说,对git remote -v上显示的远程存储库的引用)可能没有得到更新。

以上结果是您的推送与您的远程/分支同步您的本地/分支,但是,本地仓库中的缓存仍然显示先前提交(本地/分支...仅提供单个提交)作为HEAD。

要确认上面克隆了不同位置的repo并尝试比较local / branch HEAD和remote / branch HEAD。如果它们都相同,那么你可能面临我所做的问题。

解:

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)

现在做一个push -f如下

git push -f github master ###注意你的命令不再有origin了!

做一个git pull现在git pull github master

git status收到

# On branch master

nothing to commit (working directory clean)

我希望这对某些人有用,因为视图的数量太高,以至于搜索此错误几乎总是将此线程列在顶部

有关详细信息,请参阅gitref


2
投票

当我使用TortoiseGIT进行切换/结账时,我确实发生了这种情况。

我的问题是我根据另一个本地分支创建了分支。它在/.git/config中创建了一个“合并”条目,看起来像这样:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

无论何时我切换到“网络”分支,它都告诉我在开发之前我有100多个提交。好吧,我不再承诺发展,所以这是真的。我能够简单地删除此条目,它似乎正在按预期运行。它正在跟踪远程参考,而不是抱怨在开发分支后面。

正如Vikram所说,这个Stack Overflow线程是Google搜索此问题时的最佳结果,所以我想我会分享我的情况和解决方案。


2
投票

然后,当我执行git状态时,它告诉我我的分支是由X提交提前(可能与我提交的提交数量相同)。

我的经验是在一个有许多分支的团队环境中。我们在我们自己的功能分支(在本地克隆中)工作,这是git status显示我提前11次提交的其中一个。我的工作假设,就像问题的作者一样,+ 11来自我自己的承诺。

事实证明,我已经在几周前从常见的develop分支进入了我的功能分支 - 但是忘记了!当我今天重新访问我的本地功能分支并做了一个git pull origin develop时,数字跳转到+41提交。在develop已经做了很多工作,因此我的本地特色分支甚至比origin存储库上的功能分支更进一步。

因此,如果您收到此消息,请回想一下您可能从您有权访问的其他分支机构(您自己或其他分支机构)所做的任何拉动/合并。该消息只是表明您需要git push那些pulled更改回origin repo('跟踪分支')从您当地的回购以使事情同步。


1
投票

答案表明git pullgit fetch是正确的。 当git status看到.git/FETCH_HEAD.git/refs/remotes/<repository>/<branch>(例如.git/refs/remotes/origin/master)之间的差异时,会生成该消息。

后一个文件记录上次提取的HEAD(对于存储库/分支)。执行git fetch会将两个文件更新到分支的当前HEAD。 当然,如果没有东西可以获取(因为本地存储库已经是最新的),那么.git/FETCH_HEAD不会改变。


1
投票

我想重申@Marian Zburlia上面提到的相同内容。它对我有用,并会向其他人提出同样的建议。

git pull origin develop

应该跟随$ git pull --rebase

这将删除最新拉动后$ git status上发表的评论。


1
投票

git fetch将为您解决此问题

如果我的理解是正确的,那么您的本地(缓存)origin/master已经过时了。此命令将从服务器更新存储库状态。


1
投票

这对我有用

git reset --hard origin/master

输出必须看起来像

On branch dev HEAD is now at ae1xc41z Last commit message


0
投票

如果在执行提交后收到此消息以便取消分支中的文件,请尝试在任何文件中进行一些更改并执行提交。显然你不能进行单一提交,其中只包括未跟踪先前跟踪的文件。最后这篇文章帮我解决了整个问题https://help.github.com/articles/removing-files-from-a-repository-s-history/。我只需要从存储库历史记录中删除文件。


119
投票

使用

git pull --rebase

--rebase选项意味着git会将您的本地提交移到一边,与远程同步,然后尝试从新状态应用您的提交。


59
投票

使用这3个简单的命令

第1步:git checkout <branch_name>

第2步:git pull -s recursive -X theirs

第3步:git reset --hard origin/<branch_name>

更多细节:https://stackoverflow.com/a/39698570/2439715

请享用。


49
投票

我认为你误读了这个消息 - 你的分支不是master,它是master。它领先于origin/master,它是一个远程跟踪分支,记录您上一个pushpullfetch的远程存储库的状态。它告诉你你到底做了什么;你领先遥控器,它提醒你推动。


26
投票

有人说你可能误读了你的信息,你不是。这个问题实际上与你的<project>/.git/config文件有关。在它中将是类似于这样的部分:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

如果从项目的.git / config文件中删除fetch行,你将停止“你的分支在N提交的'origin / master'之前。”发生的烦恼。

或者我希望如此。 :)


9
投票

我在我的舞台服务器上遇到过这个问题。硬复位帮我清理HEAD和遥控器一样。

git reset --hard origin/master

所以现在我又来了:

On branch master
Your branch is up-to-date with 'origin/master'.

8
投票

我在这个页面上完成了每个解决方案,幸运的是@ anatolii-pazhyn评论说,因为他的解决方案是有效的。不幸的是,我没有足够的声誉来支持他,但我建议先尝试他的解决方案:

git reset --hard origin/master

哪个给了我:

HEAD is now at 900000b Comment from my last git commit here

我还建议:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

您还可以使用:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

祝你好运


8
投票

在我的情况下,这是因为我切换到掌握使用

 git checkout -B master

只是拉它的新版本而不是

 git checkout master

第一个命令resets the head of master到我最近的提交

我用了

git reset --hard origin/master

解决这个问题


4
投票

我在Windows机器上遇到同样的问题。当我运行git pull origin master命令时,我会通过“X commits”警告“获得'origin / master'。我发现,如果我改为运行git pull origin而没有指定分支,那么我将不再收到警告。

© www.soinside.com 2019 - 2024. All rights reserved.