Git说本地分支是远程分支的后面,但事实并非如此

Tim*_*nke 81 git git-push

场景:

  1. 我做了一个新的分支
  2. 破解它
  3. 提交它
  4. 推它
  5. 再破解它
  6. 再次提交
  7. 试着再次推动

Git回应:

更新被拒绝,因为您当前分支的提示落后于其远程对手.等等

我是唯一一个黑客入侵这个分支的人 - 没有其他人在触摸它.远程分支实际上位于本地分支之后.我根本不应该拉.

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

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

要清楚,我不会在任何地方分支,也没有其他人在研究它:

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

Local:  Commit A -------- Commit B -------- Commit C  
Run Code Online (Sandbox Code Playgroud)

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

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

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  
Run Code Online (Sandbox Code Playgroud)

不是; 它是B的直接延续.

Chr*_*ial 194

你可能做了一些历史改写?您的本地分支与服务器上的分支不同.运行此命令以更好地了解发生的情况:

gitk HEAD @{u}
Run Code Online (Sandbox Code Playgroud)

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

git push -f
Run Code Online (Sandbox Code Playgroud)

-f品牌这个"强制推"和覆盖服务器上的分支.当你在团队中工作时,这是非常危险的.但既然你是独立的,并确保你的当地国家是正确的,这应该没问题.如果不是这种情况,您可能会失去提交历史记录.

  • 就是这样.在第2步,我做了一个"Amend Last Commit",然后推了推,然后又砍了一些,然后再次尝试推进.我误解了Amend的工作方式.谢谢! (13认同)
  • "HEAD"和"@ {u}"都指的是提交.他们告诉gitk,哪些分支显示.`HEAD`指的是当前检出的分支,`@ {u}`是`HEAD @ {u}`的缩写,表示当前检出的分支的上游分支.所以对于例如.`master`,通常是`origin/master`. (5认同)
  • 这似乎非常有用 - 但有人可以解释'HEAD @ {u}'语法吗? (4认同)

小智 6

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

尝试这个 :

git pull --rebase <url>
Run Code Online (Sandbox Code Playgroud)

然后

git push -u origin master
Run Code Online (Sandbox Code Playgroud)