为什么“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
    

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

    要警告的是,如果你倒退分支,其他人可能会在拉时出问题。
    他们有可能会在分支中合并他们与您发布的新分支进行合并,从而有效地保留您试图摆脱的更改。
    但是,它只会是他们的副本,具有不良的修订。 出于这个原因,重绕分支被认为是轻度反社会的。 尽管如此,它通常是合适的。

    链接地址: http://www.djcxy.com/p/7557.html

    上一篇: Why "git push helloworld +master:master" instead of just "git push helloworld"?

    下一篇: How to use git ? git