为什么;git push helloworld+;船长:船长;而不仅仅是;git推helloworld“吗;?

为什么;git push helloworld+;船长:船长;而不仅仅是;git推helloworld“吗;?,git,git-push,Git,Git Push,最初,我试图推动我(有史以来第一次!)的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:

最初,我试图推动我(有史以来第一次!)的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'
因此,我找到了关于“修订承诺”的信息,并尝试了一个建议,但并不知道它是否对我有帮助:

KaiserSosa@SMICHAELS /c/test/helloworld (master)
$ git push helloworld +master:master
成功了

但我不知道为什么它解决了我的问题:(


有人能解释一下为什么这样做有效,但“
git push helloworld
”不行吗?

看来您已经在主分支中重写了历史记录(与提交相关的SHA-1)

这意味着,您不能再以快进模式推进

+主机强制执行推送:
通过使用可选的leading+,您可以告诉git更新
ref,即使更新不是快进的

注意:如果其他任何人已经克隆了您的存储库,这可能会很糟糕,因为他们将不再能够在没有冲突的情况下直接拉取您的主分支。
另见此


注:如上所述:

有两个独立的安全机制:

  • 发送端安全性可以通过“
    git push--force
    ”和/或使用前缀为“
    +
    ”的refspec来覆盖

  • 接收端安全性可以由要推入的存储库的配置变量
    receive.denynonfastworwards
    覆盖

后者默认为“不安全”,但如果在存储库中激活了安全,则发送端的强制将不会停用它。看来,双方都需要同意允许不安全行为


如本节所述,一种可能的行动方案是:

最有可能的原因是,您需要首先从远程拉。通过先获取然后检查日志,可以看到远程端发生了什么变化。比如说,

将列出远程端拥有的、您的端没有的所有更改。
如果需要图形表示,请使用
gitk--left-right master…origin/master

左侧的箭头是您要推动的更改,右侧的箭头是远程侧的更改

其他解决方案(即您所做的):

这将强制更新。如果您没有权限,那么有时这会起作用:

i、 例如,首先远程删除分支(这通常是允许的),然后重新推送“新的”(或者可能是重新缠绕的)分支

请注意,如果您倒带分支,其他分支在拖动时可能会遇到问题。
它们有可能合并到它们获取的分支中,与您发布的新分支合并,从而有效地保留您试图删除的更改。
然而,只有他们的副本有不好的修改。因此,倒带分支被认为是轻度反社会的。尽管如此,这通常是恰当的


这是一个私有的git存储库,只是为了学习诀窍——所以我不担心与其他人的冲突。我想做的是删除此存储库,并在下次正确执行。在我收到“[拒绝]”消息后,我应该做什么来代替“+master:master”?就是这样。非常感谢你!我从头开始重做,但这次我先拉了一下,结果成功了。多么奇怪的怪癖!在Mercurial中,当我建立一个新项目时,我从来没有做过这样的事情。出于同样的原因,hg push有一个force标志。如果您更改历史记录(通过mq或其他方式),则必须强制推送。为响应您的评论,添加了另一个解决方案。
 $ git fetch origin
 $ git log master..origin/master
$ git push origin +branchname
$ git push origin :branchname
$ git push origin +branchname