我最初尝试推送我的(第一次!)git repo:
$ 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'
所以我找到another StackOverflow question关于“修改后的提交”,并在那里尝试了一个建议而不知道它是否会对我有所帮助:
KaiserSosa@SMICHAELS /c/test/helloworld (master)
$ git push helloworld +master:master
有效!
但我不知道为什么它解决了我的问题:(
有人可以解释为什么会这样,但“git push helloworld
”却没有?
答案 0 :(得分:20)
您的主分支似乎已重写了您的历史记录(与提交相关联的SHA-1)。
这意味着,您无法再进入快进模式。
+大师强制进行推动:
通过使用可选的前导+,即使更新不是快进,也可以告诉git更新<dst>
ref。
注意:如果其他人已经克隆了您的存储库,这可能会很糟糕,因为他们将不再能够在没有冲突的情况下拉出您的主分支。
另请参阅此SO answer for more。
注意:如上所述by 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
即,首先远程删除分支(这通常是允许的),然后重新推送“新”(或可能是重绕)分支。
请注意,如果你倒带分支,其他人在拉动时可能会遇到问题 他们有可能在他们发布的分支中合并你已经发布的新分支,有效地保留你想要摆脱的变化。
但是,只有他们的副本才会有不好的修改。出于这个原因,重绕分支被认为是轻微的反社会。尽管如此,它通常是合适的。