首页 > 解决方案 > `git pull` 失败,现有历史记录“无法快进”

问题描述

我已经阅读了很多关于主题错误消息的其他问题(“不可能快进”),但它们似乎都不适用于我的情况。我创建一个分支 ( git checkout -b issue-215),进行更改并在本地提交。我推送更改,然后进行新更改和另一个本地提交:

* 4b797d2a - (HEAD -> issue-215) 
* 180a7ab5 - (origin/issue-215)
* 863ef01a - (origin/master, origin/HEAD, master)

ETA:根据评论中的要求,输出git branch --all -v

* issue-215                 4b797d2a [ahead 1] 
  ... other branches ...
  master                    863ef01a 
  
  remotes/origin/issue-215  180a7ab5 
  ...other remotes....
  remotes/origin/HEAD       -> origin/master
  remotes/origin/master     863ef01a 

没有新的远程更改,但 VSCode 想要在推送之前拉取。这就是我得到这个错误的地方。因此,为了进行故障排除,我git pull origin issue-215手动运行,并获得以下输出:

$ git pull origin issue-215
From ssh://my.repo/project
 * branch              issue-215  -> FETCH_HEAD
fatal: Not possible to fast-forward, aborting.

请记住,服务器上没有新的更改,从我当前的本地提交回到远程分支的历史,回到masterand origin/master,是一条直线。我不想合并或变基,我的本地代码已经是我应该拉的分支的直接子代。

这只是大约一个月前才开始发生的。以前,单击 VSCode 中的“同步”按钮会起作用,但从那以后它总是会失败并显示此错误消息。我可以进行某种导致这种行为的 gitconfig 更改吗?我的全局 gitconfig 文件中没有太多内容,并且至少有 2 个项目会发生这种情况,所以我认为这不是我对存储库所做的事情。

标签: git

解决方案


这是 Git 2.33.1 版的一个已知问题。它应该在 2.33.2 中修复。 其他普遍有用的建议如下:


“不可能快进”消息意味着您将您的配置配置git pull为使用git merge --ff-only,也许使用git config pull.ff only. 尽职git pull尽责地运行:

git fetch origin issue-215
git merge --ff-only FETCH_HEAD

第二个命令给你错误并停止。(编辑:如果您自己手动执行此操作并且它有效,则您遇到了脚注 1 中的错误。)

请记住,服务器上没有新的更改,从我当前的本地提交返回到远程分支,返回到 master 和 origin/master 的历史是一条直线。

显然(从错误中),它不是. 1 提取后,运行:

git log --all --graph --decorate --oneline FETCH_HEAD

看看它不在哪里;为什么不是是一个不同的问题。我怀疑答案是这样的:

  • origin是 GitHub;
  • 其他人正在使用REBASE AND MERGESQUASH AND MERGE按钮;
  • 因此,您获得的提交fetch逻辑上等同于您之前推送的提交,但具有不同的哈希 ID

然后,常规合并或变基将起作用,但ff-only不会。(这不是唯一可能的解释:例如,其他托管站点具有相同的效果,但有时具有不同的按钮标签。)

这只是大约一个月前才开始发生的。以前,单击 VSCode 中的“同步”按钮会起作用,但从那以后它总是会失败并显示此错误消息。我可以进行某种导致这种行为的 gitconfig 更改吗?

这可能是您更改的内容,例如设置pull.ffonly. 这可能是其他人更改的内容,例如从MERGEGitHub 切换到REBASE AND MERGE.


1 Git 2.33.1 中有一个错误,它pull.ff only拒绝了它不应该有的无操作案例。如果你有 Git 2.33.1,要么升级它,要么在这种情况下使用git fetch然后git merge --ff-only


推荐阅读