我已经阅读了很多有关该主题错误消息的其他问题(“无法快进”),但它们似乎都不适用于我的情况。我创建一个分支 ( git checkout -b issue-215),进行更改,然后在本地提交。我推送更改,然后进行新的更改和另一个本地提交:
* 4b797d2a - (HEAD -> issue-215)
* 180a7ab5 - (origin/issue-215)
* 863ef01a - (origin/master, origin/HEAD, master)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
没有新的远程更改,但 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.
Run Code Online (Sandbox Code Playgroud)
请记住,服务器上没有新的更改,并且从我当前的本地提交返回到远程分支(返回到master和origin/master)的历史记录是一条直线。我不想合并或变基,我的本地代码已经是我应该拉动的分支的直接子代。
这大约一个月前才开始发生。以前,单击 VSCode 中的“同步”按钮可以正常工作,但从那时起,它总是失败并显示此错误消息。我是否可以进行某种 gitconfig 更改来导致此行为?我的全局 gitconfig 文件中没有太多内容,并且至少有 2 个项目发生这种情况,所以我认为这不是我对存储库所做的事情。
这是 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
Run Code Online (Sandbox Code Playgroud)
第二个命令给出错误并停止。(编辑:如果您自己手动执行此操作并且它有效,那么您就会遇到脚注 1 中的错误。)
请记住,服务器上没有新的更改,并且从我当前的本地提交返回到远程分支、返回到 master 和 origin/master 的历史记录是一条直线。
显然(从错误来看),它不是。1 获取后,运行:
git log --all --graph --decorate --oneline FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)
看看哪里不存在;为什么不是另一个问题。我怀疑答案是这样的:
origin是 GitHub;fetch等同于您之前推送的提交,但具有不同的哈希 ID。常规合并或变基会起作用,但ff-only不会。(这不是唯一可能的解释:例如,其他托管站点具有相同的效果,但有时具有不同的按钮标签。)
这大约一个月前才开始发生。以前,单击 VSCode 中的“同步”按钮可以正常工作,但从那时起,它总是失败并显示此错误消息。我是否可以进行某种 gitconfig 更改来导致此行为?
这可能是您更改的内容,例如设置pull.ff为only. 可能是其他人更改了某些内容,例如从MERGEGitHub 切换到REBASE AND MERGE.
1 Git 2.33.1 中有一个错误,pull.ff only它拒绝了不应该有的无操作情况。如果您有 Git 2.33.1,请升级它,或者在这种情况下使用git fetch和 then git merge --ff-only。