【问题标题】:Why "git push helloworld +master:master" instead of just "git push helloworld"?为什么是“git push helloworld +master:master”而不是“git push helloworld”?
【发布时间】:2010-12-01 07:58:19
【问题描述】:

我最初尝试像这样推送我的(第一次!)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”无效吗?

【问题讨论】:

  • 添加了另一个解决方案,以回应您的评论。

标签: git git-push


【解决方案1】:

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

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

+master 强制推送发生:
通过使用可选的前导 +,您可以告诉 git 更新 <dst> 引用,即使更新不是快进。

注意:如果其他人已经克隆了您的存储库,这可能会很糟糕,因为他们将不再能够在没有冲突的情况下直接拉取您的主分支。
另请参阅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

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

请注意,如果您倒回树枝,其他人可能会在拉动时遇到问题。
他们有可能会在他们获取的分支中与您发布的新分支合并,从而有效地保留您试图摆脱的更改。
但是,只有他们的副本有错误的修订。出于这个原因,倒带分支被认为是轻微的反社会行为。尽管如此,它通常是合适的。

【讨论】:

  • 这是一个私人 git 存储库,只是为了学习绳索 - 所以我不担心与他人发生冲突。我想做的是删除此存储库并在下次正确执行。收到“[rejected]”消息后,我应该怎么做而不是“+master:master”?
  • 就是这样。太感谢了!我从头开始重新做,但这次我先做了一个拉,它起作用了。多么奇怪的怪癖!在 Mercurial 中,当我建立一个新项目时,我从来没有做过这样的事情。
  • hg push 出于同样的原因有一个强制标志。如果您更改历史记录(通过 mq 或其他方式),您将不得不强制执行该推送。
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 2014-06-08
  • 2014-11-18
  • 2014-12-26
  • 2011-08-07
  • 1970-01-01
  • 2012-09-09
  • 2013-06-11
相关资源
最近更新 更多