首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么是"git push helloworld +master:master“而不是"git push helloworld"?

为什么是"git push helloworld +master:master“而不是"git push helloworld"?
EN

Stack Overflow用户
提问于 2009-09-25 06:05:33
回答 1查看 33K关注 0票数 15

我试着推动我的(第一次!)git repo最初是这样的:

代码语言:javascript
复制
$ git push helloworld

但我拿回了这个:

代码语言:javascript
复制
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,并尝试了那里的一个建议,但实际上并不知道它是否会对我有所帮助:

代码语言:javascript
复制
KaiserSosa@SMICHAELS /c/test/helloworld (master)
$ git push helloworld +master:master

啊,真灵!

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

有没有人能解释一下为什么"git push helloworld“不行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-25 06:19:09

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

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

+master强制推送发生:

通过使用可选的前导+,您可以告诉git更新<dst>引用,即使更新不是快进。

注意:如果其他人已经克隆了您的存储库,这可能是不好的,因为他们将不再能够在没有冲突的情况下拉出您的主分支。

另请参阅此SO answer for more

注意:如前所述,by Junio C. Hamano

有两种独立的安全机制:

  • 发送端安全性可以通过"git push --force“和/或通过使用以'+');
  • the为前缀的refspec来覆盖。接收端安全性可以通过您推送到的存储库的配置变量receive.denynonfastworwards来覆盖。

后者默认为"unsafe",但如果在存储库中激活了安全,则发送方的强制不会将其停用。我的意思是,双方都需要同意允许不安全的行为。

正如Git FAQ中提到的,一种可能的行动方案是:

出现这种情况的最可能的原因是,您需要首先从远程拉取。您可以通过先获取,然后检查日志来查看远程端有哪些更改。例如,

代码语言:javascript
复制
 $ git fetch origin
 $ git log master..origin/master

将列出您的远程端没有的所有更改。

如果需要图形表示,请使用gitk --left-right master...origin/master

左边的箭头是您想要推入的更改,右边的箭头是远程侧的更改。

其他解决方案(这就是您所做的):

代码语言:javascript
复制
$ git push origin +branchname

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

代码语言:javascript
复制
$ git push origin :branchname
$ git push origin +branchname

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

请注意,如果您倒带分支,其他人可能会在拉动时遇到问题。

它们有可能会合并到它们获取的分支中,与您发布的新分支合并,有效地保留您试图删除的更改。

然而,只有他们的副本有糟糕的修订。出于这个原因,倒带分支被认为是温和的反社会。尽管如此,它通常是适当的。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1475665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档