git:您的分支在X提交之前


379

这实际上是怎么发生的?

我目前正在一个仓库中工作,所以这是我的工作流程:

  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)

你好吗push,你的远程和分支配置设置是什么?
CB Bailey 2010年

2
它实际上并没有检查远程仓库,您需要执行git fetch在执行推送后获取远程仓库的最新信息,这将更新它用来跟踪的本地“远程”分支。
Sekhat

2
@Sekhat:虽然git status不检查远程存储库,git pull但可以。如果您拥有要推送到的存储库的跟踪分支,则如果推送成功,git push将更新本地跟踪分支以反映远程分支的新状态。这就是为什么我询问询问器的配置的原因,因为如果未正确进行,则可能存在配置错误。
CB Bailey

git status?真?我git status从不告诉我我的分支有多远..您是否向它传递了一些额外的论点?
哈森

4
@hasen j:git status不会转到远程存储库来检查远程分支是否已更新。它告诉您本地分支与本地存储的远程跟踪分支相比有多远。问题是法线git push(以及抓取和拉取)应该更新远程跟踪分支,而对于发问者,这似乎不起作用。要了解为什么我们需要看到git push正在使用的确切形式和本地存储库的配置,但是由于请求者已经接受了答案,所以我现在看不到这种情况。
CB Bailey 2010年

Answers:


507

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

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


1
太棒了 那才是真正的问题。我首先在Google代码上创建了一个存储库。然后,我在笔记本电脑上克隆了该存储库,然后在那里工作并推送更改,笔记本​​电脑=> code.google。我以前是在我的服务器上创建此消息的,我在该服务器上创建了一个code.google代码存储库的副本,并曾经拉过所做的更改。我认为需要提取来更新本地数据库。
rjha94

2
我们在这里有同样的问题,因为另一个分支(A)指向master的相同commitid。在这种情况下,先拉A再拉主机。当git拉出A时,commitid被更新为最后一个,因此拉出master时它没有任何实际拉出,因此git并未更新master的最后一次commitid,并警告说“先于master”。
Uberto

8
谢谢,尽管我确实注意到了一件奇怪的事。“ git fetch origin master”无济于事,但“ git fetch origin master”则有帮助。我在master分支上,所以不确定“ git fetch origin”如何在上下文中做一些不同的事情。
Parag

2
@Parag参见stackoverflow.com/questions/26350876/…,以了解这两个命令之间的区别,以及如何修改配置文件以更改行为,以便git fetch remote分支也更新remote-tracking-branch ref,因此git_status不报告“提前”。
Anatortoise House 2014年

2
@Parag,还有stackoverflow.com/questions/7365415/…答案讨论了ORIG_HEAD和FETCH_HEAD不同步,导致状态警告以及可能的配置文件更正的详细信息。
Anatortoise House 2014年

138

采用

git pull --rebase

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


3
防止无用合并并在源中生成更干净的树的一种非常好的方法!
哈特夫

1
我尝试了此命令,但仍然遇到相同的问题...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh

4
这个答案是错误的:如果您在不了解情况的情况下使用它,则可能在未来的一段时间内造成麻烦(重写历史记录!)。如果您了解这种情况,将不会解决此问题。在使用时git,请先思考一下,再不要盲目重写历史!
cmaster-恢复莫妮卡

80

使用这3个简单命令

第一步git checkout <branch_name>

第二步git pull -s recursive -X theirs

第三步git reset --hard origin/<branch_name>

更多详细信息:https : //stackoverflow.com/a/39698570/2439715

请享用。


3
这是唯一为我解决问题的答案。上面的命令奇怪地将其从12次提交降低到7次提交,最终将那些删除了
Ieuan

1
我同意这是唯一对我有用的方法。我相信GIT有时会患有多种人格障碍。
ksed

11
像@leuan一样,除了git reset --hard origin/master为我清除之外,什么也没有。
戴夫·兰德

同样,这是对我
有用

51

我想你误读消息-你的分支是不是超前master,它 master。它是领先的origin/master,这是一个远程跟踪分支,它记录从上次远程仓库的状态pushpullfetch。它在告诉您您所做的确切;您领先于遥控器,它提醒您进行推送。


22
这实际上是在我推动之后。我不得不拉(或可能要提取?)以使其没有该消息。
SeanJA

26

有人说您可能会误读您的信息,事实并非如此。此问题实际上与您的<project>/.git/config文件有关。在其中将有一个类似于以下内容的部分:

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

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

还是我希望。:)


我将在下次看到该ahead by x commits消息时检查一下。我有一段时间没有看到该消息了。
SeanJA

我有一段时间没有看到该消息了。我认为这是因为我已经开始在本地创建git repo,然后将其推送到远程repo而不是反过来...
SeanJA 2010年

我尝试了此操作,但是当我尝试提交时,它使Eclipse中的eGit开始弹出“内部错误”。不过,Git本身似乎运行良好。
user4815162342 2012年

18
那条线是做什么的?删除它会令我错过什么呢?(除了烦恼)
约翰·梅

1
这可行,但更像是抑制错误。重新添加该行,您将再次开始获得警告。
克里希纳Pandey

15

我的舞台服务器仅在拉动时出现此问题。硬重置帮助我将HEAD清理为与远程相同。

git reset --hard origin/master

所以现在我又有了:

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

我首先尝试了不使用--hard标志,并且成功了!
kroiz

12

这对我有用

git reset --hard origin/master

输出必须看起来像

On branch dev HEAD is now at ae1xc41z Last commit message


11

就我而言,这是因为我转而使用

 git checkout -B master

只是拉新版本而不是

 git checkout master

第一条命令将master的头部重置为我的最新提交

我用了

git reset --hard origin/master

要解决这个问题


9

我浏览了此页面上的所有解决方案,所幸@ 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

祝你好运


4

我在Windows机器上也有同样的问题。当我运行git pull origin master命令时,我会收到“ X提交先于'origin / master'”警告。我发现,如果我改为运行git pull origin并且未指定分支,那么我将不再收到警告。


我相信这实际上是git fetch在幕后进行的。
布莱恩·彼得森

“ git fetch”没有解决我的问题,但确实解决了。我得到了新添加的分支的列表,并显示以下消息:“您要求从远程'上游'拉出,但未指定分支。因为这不是当前分支的默认配置远程,因此必须在命令上指定一个分支线。” 并且下一个“ git status”命令未显示警告。
克里希纳·潘迪

2

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


2

尽管这个问题有点老...我当时处于类似情况,这里的回答帮助我解决了类似的问题

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

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

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

要确认上述克隆,请在其他位置复制存储库,并尝试比较本地/分支头和远程/分支头。如果两者相同,那么您可能会遇到我遇到的问题。

解:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com: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  git@github.com:schacon/hw.git (fetch)
github  git@github.com: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

当我使用TortiseGIT进行切换/结帐时,实际上发生了这种情况。

我的问题是我已经基于另一个本地分支创建了分支。它在其中创建了一个“合并”条目,/.git/config如下所示:

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

每当我切换到“ Web”分支时,它都告诉我,开发之前要提交100多个提交。好吧,我不再致力于开发,这是事实。我能够简单地删除该条目,它似乎按预期运行。它可以与远程ref一起正确跟踪,而不是抱怨在developer分支后面。

就像Vikram所说的那样,这个Stack Overflow线程是Google搜索此问题时的最高结果,所以我想我将分享我的情况和解决方案。


2

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

git pull origin develop

应该紧跟着$ git pull --rebase

这将删除$ git status最新拉动之后出现的注释。



2

然后,当我执行git status时,它告诉我我的分支在X commits之前(可能与我进行提交次数相同)。

我的经验是在具有许多分支机构的团队环境中。我们在自己的功能分支中工作(在本地克隆中),这是git status表明我提前11次提交的工作之一。像问题的作者一样,我的工作假设是+11来自我自己的提交

事实证明,我已经在develop几周前将更改从common 分支引入了我的feature分支-但是忘了!当我今天重新访问我的本地功能分支并执行一次git pull origin develop该操作时,该数字跃升至+41。已经完成了很多工作develop,因此我的本地功能分支甚至比origin存储库中的功能分支还要领先。

因此,如果收到此消息,请回想一下您可能从其他有权访问的分支机构(自己的或其他分支机构)进行的任何拉/合并。该消息只是表明您需要对git push这些pull更改进行更改,然后将其origin从本地存储库返回到存储库(“跟踪分支”),以使事物同步。


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不会更改。


对于我来说,情况似乎并非如此:.git/FETCH_HEADcontains 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URL.git/refs/remotes/origin/mastercontains 9f7336c873ccffc772168bf49807e23ff74014d3,但我仍然收到消息,也git pull没有git fetch解决它
Davide

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.