我正在使用Git来管理我的两台计算机和我的开发。我正在尝试将更改提交给GitHub并且我收到了错误。
无法将某些参考推送到
<repo>
。为了防止您丢失历史记录,拒绝了非快进更新。在再次推送之前合并远程更改。
可能导致此问题的原因以及如何解决此问题?
编辑:
拉回购物品会返回以下内容:
* branch master-&gt; master(非快进) 已经向上最新
推送仍然给我上述错误。
答案 0 :(得分:121)
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
,它应该会给你一个关于出了什么问题的线索 - 在历史中寻找“叉子”。
答案 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
对话框弹出的底部看到:
...但我犯了一个大错误,忘记按 Fetch
按钮查看是否有最新的,但我没有。
提交成功执行,但不是推送,而是给出了同样提到的错误; ...即使其他开发人员没有更改与我相同的文件,我也无法提取最新的文件,因为出现了相同的错误。
大多数时候我更喜欢使用 Sourcetree 的 GUI(图形用户界面)。这个解决方案可能并不理想,但是这让我重新开始工作,而不必担心我可能会丢失我的更改或损害其他开发者的最新更新。
右键单击您之前的提交以撤消本地提交的更改,然后像这样选择 Reset current branch to this commit
:
一旦所有加载微调器消失并且 Sourcetree 完成加载前一个提交,在窗口的左上角,点击 Pull
按钮...
...然后会弹出一个对话框,点击右下角的OK
按钮:
拉取最新版本后,如果没有出现任何错误,请跳至第 4 步(下面的下一步)。否则,如果您此时发现任何合并冲突,就像我对 Web.config
文件所做的那样:
...然后单击顶部的 Stash
按钮,将出现一个对话框弹出窗口,您需要编写一个 Descriptive-name-of-your-changes,然后单击 {{ 1}} 按钮:
...一旦 Sourcetree 完成保存更改的文件,请在 STEP 2 中重复操作(上面的上一步),然后您的本地文件将具有最新更改。现在可以通过打开在 Sourcetree 左列底部看到的 OK
重新应用您的更改,使用箭头展开您的隐藏,然后右键单击以选择 STASHES
,然后选择 {{ 1}} 弹出对话框中的按钮:
如果您现在有任何合并冲突,请转到您首选的文本编辑器,例如 Visual Studio Code,并在受影响的文件中选择 Apply Stash 'Descriptive-name-of-your-changes'
链接,然后保存:
然后返回 Sourcetree,点击顶部的 OK
按钮:
然后右键单击冲突的文件,并在 Accept Incoming Change
下选择 Commit
选项:
终于!!!我们现在可以提交我们的文件,也可以在点击 Resolve Conflicts
按钮之前勾选 Mark Resolved
选项:
附言在写这篇文章的时候,另一个开发者在我提交之前提交了一个提交,所以不得不重复很多步骤。