为什么“git push helloworld + master:master”而不仅仅是“git push helloworld”?

时间:2009-09-25 06:05:33

标签: git git-push

我最初尝试推送我的(第一次!)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”却没有?

1 个答案:

答案 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
  

即,首先远程删除分支(这通常是允许的),然后重新推送“新”(或可能是重绕)分支。

     

请注意,如果你倒带分支,其他人在拉动时可能会遇到问题   他们有可能在他们发布的分支中合并你已经发布的新分支,有效地保留你想要摆脱的变化。
  但是,只有他们的副本才会有不好的修改。出于这个原因,重绕分支被认为是轻微的反社会。尽管如此,它通常是合适的。