“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 --amend
或git 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 推送非快进更新被拒绝”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章