“Git推动非快进更新被拒绝”是什么意思?

时间:2011-01-13 19:31:32

标签: git version-control

我正在使用Git来管理我的两台计算机和我的开发。我正在尝试将更改提交给GitHub并且我收到了错误。

  

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

可能导致此问题的原因以及如何解决此问题?

编辑:

拉回购物品会返回以下内容:

  

* branch master-&gt; master(非快进)   已经向上最新

推送仍然给我上述错误。

6 个答案:

答案 0 :(得分:121)

GitHub有一个很好的部分叫做“Dealing with “non-fast-forward” errors

  

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

     

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


Git无法像快进合并那样对遥控器进行更改,Visual Git Reference说明如下:

alt text

这不是完全你的情况,但有助于查看“快进”是什么(其中分支的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,它应该会给你一个关于出了什么问题的线索 - 在历史中寻找“叉子”。

答案 1 :(得分:48)

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

解决此问题
git pull

之前

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

答案 2 :(得分:10)

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

答案 3 :(得分:2)

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

git push origin master --force

答案 4 :(得分:0)

请勿执行git -f进行推送,因为它可能导致以后的灾难性后果。

您只需要对本地分支机构进行git pull。

例如:- git pull origin'your_local_branch'

然后执行git push

答案 5 :(得分:0)

在我遇到完全相同的错误的情况下,我也不是唯一的开发人员。

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

Checked option for: Push changes immediately to origin

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

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

GUI 解决方案

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

第 1 步

右键单击您之前的提交以撤消本地提交的更改,然后像这样选择 Reset current branch to this commit

Sourcetree window with right-clicked commit and selecting: Reset current branch to this commit

第 2 步

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

Sourcetree window with with the Pull button highlighted

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

Sourcetree window dialog popup with the OK button highlighted

第 3 步

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

Sourcetree window showing the error hint: Updates were rejected because the tip of your current branch is behind

...然后单击顶部的 Stash 按钮,将出现一个对话框弹出窗口,您需要编写一个 Descriptive-name-of-your-changes,然后单击 {{ 1}} 按钮:

Sourcetree window with Stash button highlighted and dialog popup showing input to name your stash with OK button highlighted

...一旦 Sourcetree 完成保存更改的文件,请在 STEP 2 中重复操作(上面的上一步),然后您的本地文件将具有最新更改。现在可以通过打开在 Sourcetree 左列底部看到的 OK 重新应用您的更改,使用箭头展开您的隐藏,然后右键单击以选择 STASHES,然后选择 {{ 1}} 弹出对话框中的按钮:

Sourcetree window with the Stashes section expanded and changes right-clicked with Apply Stash highlighted

Sourcetree dialog popup ask your to confirm if you would like to apply stash you your local copy

如果您现在有任何合并冲突,请转到您首选的文本编辑器,例如 Visual Studio Code,并在受影响的文件中选择 Apply Stash 'Descriptive-name-of-your-changes' 链接,然后保存:

enter image description here

然后返回 Sourcetree,点击顶部的 OK 按钮:

enter image description here

然后右键单击冲突的文件,并在 Accept Incoming Change 下选择 Commit 选项:

enter image description here

第 4 步

终于!!!我们现在可以提交我们的文件,也可以在点击 Resolve Conflicts 按钮之前勾选 Mark Resolved 选项:

enter image description here

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