更新被拒绝,因为您当前分支的最新提交落后于其远程分支。

828

我们的工作流程如下。我们有一个名为dev的分支,在origin/dev处可以访问它。当我们进行更改时,我们会从dev创建一个分支:

git checkout -b FixForBug origin/dev

现在我有一个名为FixForBug的分支,它正在跟踪(我认为这是正确的词语)origin/dev。 因此,如果我执行git pull,它将从origin/dev引入新的更改,非常棒。 现在,当我完成我的修复后,我将其推送到同名的远程分支。

首先,我从origin/dev下载任何更改,并进行变基:

git pull --rebase

然后我将更改推送到同名的远程分支:

git push origin FixForBug

现在,远程服务器上有一个分支,我可以创建一个拉取请求来批准并合并该更改到dev分支中。我从不自己推送任何东西到origin/dev。我猜这是一个很常见的工作流程。
第一次进行git push时,它能够正常工作并创建远程分支。但是,如果我第二次推送(比如在代码审核期间,有人指出了问题),我会收到以下错误信息:
“error: failed to push some refs to 'https://github.mydomain.info/Product/product.git' Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g. git pull ...) before pushing again. See the 'Note about fast-forwards' in 'git push --help' for details.”
但是,如果我运行git status,它说我比origin/dev多了1个提交(这是有道理的),如果我遵循提示并运行git pull,它会说一切都是最新的。 我认为这是因为我将更改推送到与上游分支不同的分支。 我可以通过运行以下命令来解决此问题: git push -f origin FixForBug 在这种情况下,它会将更改推送到远程分支,显示(forced update),并且在远程分支上一切似乎都很好。
我的问题是:在这种情况下,为什么需要使用-f?通常情况下,当您强制某些内容时,是因为您做错了事情或者至少是违反标准惯例。 这样做是否正确,或者它会搞乱远程分支中的某些东西,或者为最终将我的东西合并到dev中的人创建麻烦?

4
看起来你收到的信息是在告诉你远程分支FixForBug比本地分支FixForBug领先。在推送之前,你应该拉取那个远程分支的更改并将它们合并到你的本地分支中。 - mhatch
15
所以,在我推送之前,基本上要运行 git pull origin FixForBug 对吗?好的,这很有道理。你可以将其作为一个答案添加! - Mike Christensen
7
Stack Overflow最常被复制的问题(纯文本版): https://stackoverflow.blog/2021/04/19/how-often-do-people-actually-copy-and-paste-from-stack-overflow-now-we-know/ - Peter Mortensen
如果您刚刚克隆了此存储库,请尝试拉取远程原始数据。我曾经克隆过我们的repo,但在第一次推送之前忘记拉取“develop”分支,并成功解决了这个错误。 - Paul G
1
不确定,但有时当您在远程分支中具有与您正在推送的相同名称的分支(可能是从该分支创建的PR)时会发生此错误。 您需要删除该分支并关闭PR。 - Neeraj Sonaniya
显示剩余4条评论
30个回答

1
我有一个有趣的案例:收到了一条带有尚未在远程上的分支的消息,我刚刚创建了它,进行了编辑、提交,尝试了一次推送--上游,嘭!有趣。

0

请确认您的远程分支没有被锁定。


0

由于我尝试提交的分支是主分支下的子分支,因此我首先从存储库中将其删除(由于存在后向引用问题)。然后重新尝试使用push命令,这次成功了!

注意:在删除初始分支的同时,我将要推送的所有先前更改都包含在内,因此没有代码丢失。


0

你必须在提交中添加了尚未推送的新文件。检查该文件,再次推送该文件,然后尝试拉取/推送。

这样就可以了。这对我有用...


0

您的本地主分支: -> HEAD~N -> 已更新和新文件(无法推送到 GitHub!)

您的 GitHub 主分支: -> HEAD~N -> AheadNewCommit1 -> AheadNewCommit2 ...

步骤1. 重置到 HEAD~N

$  git reset --soft HEAD~N

步骤2:将 AheadNewCommit1 -> AheadNewCommit2 ... 拉取到您的本地主分支

$  git pull origin master

0

我只在自动化环境中遇到了这个问题,即 Gitlab 流水线和 Github actions,在发布分支自动合并和推送的过程中。对我有效的唯一手动解决方案是创建一个具有相同更改的新分支,并在新分支上运行流水线。

我还没有弄清楚如何永久修复它在 Gitlab 和 Github 流水线中。


0
如果你将主分支从master改为main,请执行以下操作: git push --set-upstream origin main

0
不确定对我来说问题是什么,但是当我尝试推送时,我收到了相同的错误信息。
对我有效的方法是:
git push pmagunia HEAD:develop

您可以将 pmagunia 替换为您的远程名称,或可能是 origin

-1
在Android Studio中,在右下角切换到主分支/源分支。

-4
首先,您必须从远程获取更改,然后才能推送更改。为此,您必须编写命令。
git pull 

在那之后,你会发现一些冲突,请解决完冲突之后再编写命令。

git push

这个修复方法对我有效,你也可以试试。我认为由于远程上的冲突,我们无法推送代码。


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