“Git 推送非快进更新被拒绝”是啥意思?

Posted

技术标签:

【中文标题】“Git 推送非快进更新被拒绝”是啥意思?【英文标题】:What does "Git push non-fast-forward updates were rejected" mean?“Git 推送非快进更新被拒绝”是什么意思? 【发布时间】:2011-06-08 17:36:43 【问题描述】:

我正在使用 Git 来管理我的两台计算机和我的开发。我正在尝试向 GitHub 提交更改,但出现此错误:

未能将一些参考推送到<repo>。为防止您丢失历史记录,拒绝了非快进更新。在再次推送之前合并远程更改。

可能是什么原因造成的,我该如何解决?

编辑:

拉取 repo 会返回以下内容:

*branch master->master(非快进) 已经更新了

推送仍然给我上述错误。

【问题讨论】:

另见Git non-fast-forward rejected。 【参考方案1】:

这意味着有其他提交推送到远程存储库与您的提交不同。您通常可以使用

解决此问题
git pull

在你推送之前

最终,“快进”意味着提交可以直接应用到工作树的顶部,而无需合并。

【讨论】:

这对我有用!我忘了我更改了存储库站点上的 readme.md!【参考方案2】:

快进更新是一侧的唯一更改发生在另一侧的最近提交之后,因此不需要进行任何合并。这就是说您需要在推送之前合并您的更改。

【讨论】:

【参考方案3】:

GitHub 有一个不错的部分,叫做“Dealing with “non-fast-forward” errors”

这个错误一开始可能有点压倒性,不要害怕。简单地说,git 不能在不丢失提交的情况下在远程进行更改,所以它拒绝推送。 通常这是由另一个用户推送到同一个分支引起的。您可以通过获取和合并远程分支来解决此问题,或者使用 pull 同时执行这两项操作。

在其他情况下,此错误是由于使用 git commit --amendgit rebase 等命令在本地进行的破坏性更改造成的。 虽然您可以通过将 --force 添加到 push 命令来覆盖远程,但只有在您绝对确定这是您想要做的事情时才应该这样做。 强制推送可能会导致其他已获取远程分支的用户出现问题,并且被认为是不好的做法。 如有疑问,请勿强行推动


Git 不能像快进合并那样在远程上进行更改,Visual Git Reference 说明如下:

完全是你的情况,但有助于了解什么是“快进”(其中一个分支的 HEAD 只是移动到一个新的更新提交)。


branch master->master (non-fast-forward) Already-up-to-date”通常用于不跟踪其远程对应部分的本地分支机构。 例如,请参阅这个 SO 问题“git pull says up-to-date but git push rejects non-fast forward”。 或者这两个分支有联系,但与各自的历史不一致: 见“Never-ending GIT story - what am I doing wrong here?”

这意味着你的 subversion 分支和你的远程 git master 分支在某些事情上不一致。 一些更改被推送/提交给另一个不在的更改。 启动gitk --all,它应该会给你一个关于哪里出了问题的线索——在历史中寻找“分叉”。

【讨论】:

【参考方案4】:

在这种情况下,您可能希望对推送操作使用强制

git push origin master --force

【讨论】:

错了。 github的总源将被删除并推送只有你是新源旧源被删除 当心--force的阴暗面。【参考方案5】:

在将更改推送到远程 repo/fork 之前,您需要合并并解析 conflicts locally

1) 拉取(获取和合并)

$ git pull remote branch 

2) 推送更改

$ git push remote branch 

您仍然可以通过使用--force 选项来快速选择push,但应该避免,因为这可能会导致更改丢失或对其他贡献者造成严重影响。

【讨论】:

【参考方案6】:

永远不要使用git -f 来使用push,因为这可能会导致以后的灾难性后果。

您只需要在您当地的分支机构做一个git pull

例如:

git pull origin 'your_local_branch'

然后做一个git push

【讨论】:

【参考方案7】:

对于完全相同的错误,我也不是唯一的开发人员。

所以我同时提交并推送我的更改,在Commit 对话框弹出窗口底部看到:

...但是我犯了一个巨大的错误,忘记点击Fetch 按钮来查看我是否有最新的,而我没有。

提交成功执行,但不是推送,而是给出了相同的错误; ...即使其他开发人员没有更改与我相同的文件,我也无法提取最新的文件,因为出现了相同的错误。

图形用户界面解决方案

大多数时候我更喜欢使用 Sourcetree 的 GUI(图形用户界面)。这个解决方案可能并不理想,但这就是让我重新开始的原因,而不必担心我可能会丢失我的更改或损害其他开发人员的最新更新。

第 1 步

右键单击您之前的提交以撤消本地提交的更改并选择Reset current branch to this commit,如下所示:

第 2 步

一旦所有加载微调器消失并且 Sourcetree 完成加载上一个提交,在窗口的左上角,单击 Pull 按钮...

...然后会弹出一个对话框,点击右下角的OK按钮:

第 3 步

拉取最新后,如果您没有收到任何错误,请跳至STEP 4(下面的下一步)。否则,如果您此时发现任何合并冲突,就像我对 Web.config 文件所做的那样:

...然后点击顶部的Stash按钮,会弹出一个对话框,您需要编写一个Descriptive-name-of-your-changes,然后点击OK 按钮:

...一旦 Sourcetree 完成存储您更改的文件,重复 步骤 2 中的操作(以上步骤),然后您的本地文件将具有最新更改。现在可以通过打开 Sourcetree 左栏底部的 STASHES 重新应用您的更改,使用箭头展开您的存储,然后右键单击选择 Apply Stash 'Descriptive-name-of-your-changes',然后选择 OK 弹出对话框中的按钮:

如果您现在有任何合并冲突,请转到您喜欢的文本编辑器,例如 Visual Studio Code,并在受影响的文件中选择 Accept Incoming Change 链接,然后保存:

然后回到Sourcetree,点击顶部的Commit按钮:

然后右键单击有冲突的文件,并在Resolve Conflicts 下选择Mark Resolved 选项:

第 4 步

终于!!!我们现在可以提交我们的文件,还可以在单​​击 Commit 按钮之前选中 Push changes immediately to origin 选项:

附:在写这篇文章的时候,另一个开发者在我提交之前提交了一个提交,所以不得不重复很多步骤。

【讨论】:

【参考方案8】:

如果您的远程分支已更新并且未与您的本地存储库同步,也可能发生这种情况。所以就我而言,我创建了一个 git repo 并添加了自述文件。在我的本地机器上,我创建了要上传到该仓库的新文件,所以我尝试像往常一样推送。在那之后,我确实执行了$git pull,但它给我带来了fatal: refusing to merge unrelated histories 错误(作为bash 中的普通文本出现)。 我尝试了 rebase、re-staging 和 re-committing,但问题仍然没有解决。在这种情况下,我的目标是无论如何都要合并它,因为我想保留两者并且它们之间没有任何公共文件。所以,我通过传递参数允许不相关的历史记录如下:

$git pull origin main --allow-unrelated-histories

此命令将合并 - 忽略两者位于不同头的事实。

然后使用以下命令将其推送到源分支: $git push -u origin main

如果有人更擅长解释这一点,请随时编辑此答案。

【讨论】:

以上是关于“Git 推送非快进更新被拒绝”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

从一篇ICLR'2017被拒论文谈起:行走在GAN的Latent Space

求助 苹果审核3.1.4被拒

iOS 5.1.2审核被拒

求助appStore审核被拒的原因

ios 被拒的原因记录(因为权限问题被拒)

“?”是啥意思?在 Erlang 中是啥意思? [复制]