为什么“git push helloworld + master:master”而不是“git push helloworld”?
最初我试图推动我的(第一次!)git回购:
$ git push helloworld
但我得到了这个:
To git-smichaels@free5.projectlocker.com:helloworld.git
! [rejected] HEAD -> master (non-fast forward) error:
failed to push some refs to 'git-smichaels@free5.projectlocker.com:helloworld
git'
所以我发现了另一个关于“修改的提交”的StackOverflow问题,并从那里尝试了一个建议,但并不知道它是否对我有帮助:
KaiserSosa@SMICHAELS /c/test/helloworld (master)
$ git push helloworld +master:master
有效!
但我不知道为什么它解决了我的问题:(
有人可以解释为什么这个工程,但“ git push helloworld
”不?
看起来您已经在主分支中重写了您的历史记录(与您的提交相关联的SHA-1)。
这意味着,你不能再推入快进模式。
+主力推动发生:
通过使用可选的前导+,即使更新不是快进,也可以让git更新<dst>
ref。
注意:如果其他人已经克隆了你的仓库,这可能会很糟糕,因为他们将不再能够在不发生冲突的情况下拖动主分支。
另请参阅此SO回答了解更多。
注意:如Junio C. Hamano所述:
有两个独立的安全机制:
发送端的安全性可以通过“ git push --force
”和/或使用以' +
'为前缀的refspec来覆盖)。
接收端的安全性可以被您推送到的存储库的配置变量receive.denynonfastworwards
覆盖。
后者默认为“不安全”,但是如果在存储库中激活了安全性,来自发送方的强制不会将其停用。 IOW,两端都需要同意允许不安全的行为。
正如Git FAQ所提到的,一个可能的行动方案是:
最可能的原因是你需要先从遥控器拉出。 通过首先获取并检查日志,您可以看到远程端发生了什么变化。 例如,
$ git fetch origin
$ git log master..origin/master
将列出您的身边没有的远程方面的所有变化。
如果你想要一个图形表示,使用gitk --left-right master...origin/master
。
左边的箭头是您要推动的更改,右边的箭头是远程端的更改。
其他解决方案(这是你所做的):
$ git push origin +branchname
这将强制更新。 如果你没有权限,那么有时候这会起作用:
$ git push origin :branchname
$ git push origin +branchname
即首先远程删除分支(这通常是允许的),然后重新推入“新”(或可能倒带)分支。
要警告的是,如果你倒退分支,其他人可能会在拉时出问题。
他们有可能会在分支中合并他们与您发布的新分支进行合并,从而有效地保留您试图摆脱的更改。
但是,它只会是他们的副本,具有不良的修订。 出于这个原因,重绕分支被认为是轻度反社会的。 尽管如此,它通常是合适的。
上一篇: Why "git push helloworld +master:master" instead of just "git push helloworld"?
下一篇: How to use git ? git