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
明白了原因后,我们重新进行一遍操作,你就会发现一些端倪。
可以看到,当 .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,好久没有一发命中过了!等等,或者应该感谢的是我的提示词?
衍生话题
当我们在编辑 git-rebase-todo 文件时,可以观察一下 .git 文件夹,你会发现它多了一个 rebase-merge 文件夹。
也就是说,git 其实是根据 .git 文件夹中是否存在 rebase-merge 或者其他一些相关文件,来判断当前是处于什么状态的!这真的是把 linux 中一切皆是文件这一特点展示得淋漓尽致!