为什么 git rebase 失败?提示 could not read '.git/rebase-merge/head 我只能说,一切都是 vscode 的锅!

673 阅读3分钟

rebase 过程中出现以下警告信息:

warning: could not read '.git/rebase-merge/head-name': No such file or directory 

复现过程

首先,我的 git 默认编辑器是设置为 vscode 的:

git config --global core.editor 'code'

执行 rebase 过程

git rebase -i HEAD~3

修改内容,然后保存退出。

此时,当我们继续命令时:

git rebase --contunue

控制台报错了。

我没细看报错,只是单纯的以为哪里出了问题,于是想着,没法 rebase,那就退出吧:

git rebase --abort

但没想到,居然连退出也退出不了?这就有意思了!于是我立马一个 win+n,然后就把这个问题列出 TODO 中了。😋

然后简单搜索一番,发现解决方案就是删掉 .git/rebase-merge 文件夹:

rm .git/rebase-merge

原因分析

这是 vscode 编辑器的锅。当你使用 vscode 编辑器编辑 git 文件时,git 似乎会自动认为你已经关闭了编辑文件。然后直接进入 rebase 操作。

但此时你压根连编辑还没来得及,所以导致 rebase 过程刚开始就结束了!

但你并不知道,于是你还继续编辑。

重点来了,当你编辑完成后,你会点击保存!而此时该文件实际上已经不存在了!

但当你点击保存的时候, vscode 会自动帮你创建这个文件,也就是 .git/rebase-merge/git-rebase-todo 文件!

由于 git 识别到 .git/rebase-merge/ 文件夹,所以 git 认为当前是在 rebase 过程中。

但是当你执行 rebase 相关操作时,git 却发现根本没有 '.git/rebase-merge/head-name' 文件,于是就有了最开始的报错信息。

warning: could not read '.git/rebase-merge/head-name': No such file or directory 

明白了原因后,我们重新进行一遍操作,你就会发现一些端倪。

1.gif

可以看到,当 .git/rebase-merge/git-rebase-todo 刚打开没多久,git 就自动 hint 到我们关闭了 editor,然后 rebase 过程刚开始就结束了!

解决方案

对于报错的解决方案,那就是直接删除 .git/rebase-merge 文件夹。

对于 vscode 出现的这个问题,最简单的解决方案,当然就是使用原生 vim 了😋。

当然,我肯定是不接受这种方案的,所以这里给出继续使用 vscode 作为默认编辑器的方案。

从上面的原因分析可以知道,问题的重点在于我们还没处理完 editor,git 就认为我们关闭了 editor。

那么我们所需要做的就是让 git 知道我们还没有编辑完文件。怎么实现呢?很简单,就是为 vscode 的 code 命令添加上 -w 参数,也就是 --wait。

所以,重新修改你的 git 默认编辑器为 code -w 命令:

git config --global core.editor 'code -w'

然后你就可以愉快的继续变基了!

最后,这里要表扬一下 ChatGPT,好久没有一发命中过了!等等,或者应该感谢的是我的提示词?

image.png

衍生话题

当我们在编辑 git-rebase-todo 文件时,可以观察一下 .git 文件夹,你会发现它多了一个 rebase-merge 文件夹。

image.png

也就是说,git 其实是根据 .git 文件夹中是否存在 rebase-merge 或者其他一些相关文件,来判断当前是处于什么状态的!这真的是把 linux 中一切皆是文件这一特点展示得淋漓尽致!