Git说本地分支位于远程分支后面,但不是


82

场景:

  1. 我做了一个新的分支
  2. 骇客
  3. 提交
  4. 推它
  5. 黑客更多
  6. 再次提交
  7. 尝试再次推动

Git回应:

由于当前分支的尖端位于其远程对应的后面,因此更新被拒绝。等等

我是该分支上唯一的黑客-没有人在触摸它。远程分支实际上位于本地分支之后。我根本不用拉

(如果我确实拉,Git会报告两者之间的冲突,并迫使我将分支合并到自身中)

为什么这(可能)发生?我该如何诊断/修复它?

明确地说,我不在任何地方分支,也没有其他人在努力:

Remote: Commit A -------- Commit B  

Local:  Commit A -------- Commit B -------- Commit C  

C是B的直接延续,不涉及分支。但是git认为C是A的一个分支:

Remote: Commit A -------- Commit B  

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  

不是; 这是B的直接延续。


1
的输出git remote -vgit show remote origin(假设原点是你所遇到问题的远程)可能会有所帮助
格雷厄姆

Answers:


196

您可能做了一些历史重写?您的本地分支与服务器上的分支不同。运行以下命令以更好地了解发生了什么:

gitk HEAD @{u}

我强烈建议您尝试了解此错误的来源。要修复它,只需运行:

git push -f

-f使其成为“强制推送”,并覆盖服务器上的分支。当您在团队中工作时,这是非常危险的。但是,由于您是一个人,并且确保您所在的州是正确的,所以应该没问题。如果不是这种情况,您可能会丢失提交历史记录。


13
就是这样 在第2步中,我做了一个“修改最后提交”,然后推送,然后再黑了一些,然后尝试再次推送。我误解了Amend的工作方式。谢谢!
蒂姆·扬克

4
这似乎非常有用-但有人可以解释“ HEAD @ {u}”语法吗?
ChrisV 2013年

5
无论是HEAD@{u}参考的提交。他们告诉gitk,显示哪个分支。HEAD指当前签出的分支,@{u}是的缩写HEAD@{u},代表当前签出的分支的上游分支。所以例如。master,通常是origin/master
慢性的

如果使用相同的方案,则必须重新扫描并合并冲突。使用gitk帮助很大!
brichins '16

如果我在本地进行了许多简单的提交(而不是修改),然后尝试推送,就会发生在我身上。我知道没人在改变github上的东西。Gitk确实显示出远程控制与本地控制不同,尽管可以预期,它应该将本地显示为比远程控制更新的版本,而不是将远程系统显示为分叉(看起来像这样,我不知道要告诉多少gitk)
水瓶座力量

5

该解决方案非常简单,对我有用。

试试这个 :

git pull --rebase <url>

然后

git push -u origin master

4

当我尝试推送开发分支时(我正在使用git flow),这发生在我身上。有人将更新推送到主服务器。要解决它,我做了:

git co master
git pull

哪些获取了​​这些更改。然后,

git co develop
git pull

哪个都没做。我认为尽管出现错误消息,develop分支已经推送了。一切都是最新的,没有错误。


0

要对其进行诊断,请遵循以下答案

但要解决这个问题,知道你是唯一一个改变它,这样做:
1 -备份你的项目(我确实只在GIT中的文件,文件夹./src)
2 - git pull
3 -还原你的备份过很多“乱七八糟”的文件(与合并指标)

我尝试过git pull -s recursive -X ours但没有按照我想要的方式工作,这可能是一个选择,但是请先备份!!!

确保没有差异/更改(在git gui处)。这是我的情况,根本没有要合并的东西,但是github一直在说我应该合并...

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.