错误提示:“更新被拒绝,因为远程包含您本地没有的工作”。

275
我在一个使用Bitbucket上的团队中与几个开发人员一起工作,我们都在一个dev分支上工作,在发布之前不会推送到master
其中一个开发人员意外提交了错误的代码,导���覆盖了我的代码,现在我正在尝试将正确的代码推回到仓库。我已经阅读了几天有关此错误的资料,但是我无法再将代码推送到仓库中,因为我收到以下错误提示:
 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://myusername@bitbucket.org/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我按照指示进行了拉取操作,但是接着我遇到了合并冲突。在为合并冲突输入信息后,我的本地代码现在变成了另一个开发者意外上传的不正确的代码(如从pull中所预期的)。于是我用我在提交之前复制的备份替换了不正确的代码,但当我再次尝试推送时,出现了相同的错误。
如何解决这个问题?
以下是我运行的提交命令:
git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

我本以为如果我保持这个顺序,就不会收到合并冲突。看来我错了。
我在 Google 和 Stack Overflow 上搜索了几个小时,并按照不同的指示进行操作,但我仍然无法将 Git 推送到 dev 分支。

当您在另一个存储库的目录中时,执行git push命令会显示相同的错误消息......Git消息应该得到更新以反映这一点,特别是因为它的语气听起来非常权威,否则可能会让人误解。 - Scott Stensland
21个回答

412

您可以使用“force push”来重写Git执行的任何检查。在终端中使用以下命令:

git push -f origin master

然而,您可能会忽略已经存在于远程的工作。您实际上正在重写远程历史记录,使其与本地副本完全相同。


112
使用强制推送(-f)标志非常危险,不应成为您常规工作流程的一部分。 - Spaideri
14
由于这个回答缺少一些警告信息,所以被投下了反对票。 - Melebius
5
哦!这将迫使代码库重写自身。 - Azarsa
11
@simon,这很危险,因为它忽略了远程的工作并强制将更改推到存储库。因此,如果您不想搞乱团队的工作,请勿强制推送。 - Gásten
41
如果你做过这件事并感到内疚,但仍会再做一次,请举手。 - eric
显示剩余14条评论

103

当我们试图推送到远程存储库,但在远程创建了一个尚未被拉取的新文件(比如说 Readme)时,就会发生这种情况。在这种情况下,由于错误信息所述,

Git拒绝更新

因为我们还没有在本地环境中获取远程更新。因此,首先从远程获取最新代码。

git pull

这将更新您的本地代码库并添加一个新的Readme文件。然后将更新后的更改推送到远程代码库。

git push origin master

我之前在本地的develop分支上执行了 git pull origin develop,但现在只执行 git pull 就可以正常工作了,不知道为什么。 - Marcelo
1
因为默认情况下,如果您的本地分支与远程分支同步,并且您已经检出了该分支,则无需指定分支,只需使用“git pull”即可。 - Himanshu
git pull helps - Ahnaaf Al Rafee

80

git pull <remote> master:dev 命令将会获取remote/master分支并合并到你的local/dev分支。

git pull <remote> dev 命令将会获取remote/dev分支并合并到你当前所在的分支。

我想你说的冲突提交应该在remote/dev分支上,这也是你可能本意想要获取和合并的分支。

如果是这种情况,那么实际上你并没有将冲突合并到你的本地分支中,这有些奇怪,因为你说你在你的工作副本中看到了不正确的代码。你可能需要检查一下 remote/master 中发生了什么。


3
哇……我从未知道过这个。但现在它变得非常有意义了。主分支也是不正确的,所以你的答案解决了我的问题。我对 Git 还有点新。非常感谢告诉我这两者之间的区别! - thanos
16
对我而言,最好的选择是执行 git pull --rebase - Derek Foulk
4
这里的 dev 是指目标分支,翻译后的命令是:git pull <remote> master:dev - Ahnaaf Al Rafee

27

当存储库中包含本地没有的某些项时,通常会发生这种情况。因此,在这种情况下,为了推送我们的更改,我们需要集成远程更改,然后进行推送。

因此,请从远程创建拉取请求。

git pull origin master

然后将更改推送到远程

git push origin master

错误:致命错误:拒绝合并不相关的历史记录 - IgorGanapolsky

14
你可以尝试这个命令:git pull origin master --rebase

6
你好Eduardo!这对我有用。但是你能解释一下为什么它有效吗?这个命令具体是做什么的? - Akshaya Natarajan
在GitHub网站上手动添加README.md文件后,我也无法像通常那样从设备推送项目到Git。你的答案帮了我很多!!!谢谢兄弟 <3 - Nghien Nghien

10

您需要输入:

git pull
git fetch 
git merge
如果你使用git push origin master --force,你会遇到一个大问题。

11
为什么在运行包含git fetchgit mergegit pull命令后,需要再次手动执行这两个命令? - Melebius

9

强制推送

git push -f origin master


7
这句话可能需要附上警告。 - Chris
即使这肯定会起作用,你介意解释一下吗?这样做可能会有任何危险吗?如果是的,请进一步解释,例如:“朋友们,务必确保你会因此丢失提交记录。” - Nico Haase

9

这是我解决该问题的方法:

  1. git pull origin master(拉取远程代码)
  2. git push origin master(推送本地修改到远程仓库)

通常情况下,出现此问题是因为您的远程分支未更新。 如果您收到“请输入提交信息”的错误提示, 请参考此处(对我而言,xiaohu Wang的答案有效:))。


这里没有叫做“小胡王”的人,甚至没有接近这个名字的人(也不在已删除的答案中)。它是指哪个答案? - Peter Mortensen
@Peter Mortensen他指的是你可以通过点击链接找到的答案。 - undefined

8

我解决了问题,但我不太确定自己具体做了什么。 我尝试使用以下命令进行推送和拉取:

git pull <remote> dev 而不是 git pull <remote> master:dev


7

git pull --rebase origin master

git push origin master


git push -f origin master

警告 git push -f origin master

  • 强制推送到现有仓库,并删除先前的仓库,因此如果您不需要先前的版本,则可能会有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接