我有三个提交记录 - 一个是正常的,另外两个是无关紧要的清理工作,比如打字错误等。所以我想将它们压缩成一个提交记录。开始吧:
git rebase -i HEAD~3
听起来很简单,也应该可以正常工作——我在遇到问题后尝试了在一个全新的版本库中操作,结果按预期工作。编辑器显示了3个提交,选择顶部的提交,将另外两个压缩成一个,保存退出,完成。如果我以详细模式运行它,我会看到更多的细节——Git通过检出我所选的第一个提交进入游离HEAD状态, 然后执行'Rebasing 2/3'和'Rebasing 3/3',显然在此过程中创建了一些临时提交——然后就会出现成功消息;编辑器在某个时间点再次弹出,供我更改提交消息。一切都很好。
但是,在工作版本库中相同的命令失败了!在编辑器中有3个提交,选择-压缩-压缩...但是这次,我没有看到'Rebasing 2/3',而是在'HEAD is now at my-SHA-1'之后的第一行遇到了致命错误!
HEAD is now at 48a6c3d... <commit message>
fatal: ref HEAD is not a symbolic ref
但为什么Git希望HEAD是一个符号引用呢?变基过程会分离HEAD-就像我在探索性示例中看到的那样-那么为什么第二个示例中会致命错误,而第一个示例中不会呢?cat .git/HEAD给出了我'picked'的提交的SHA1...
我已经花费几个小时阅读和研究,但这里有些不对劲,我找不到原因!我怀疑也许一些钩子负责(对它们知之甚少,并且知道有问题的repo确实有一些)。谢谢您考虑回答这个问题!
.git/hooks/
目录下,只需将它们重命名为<hook>.off
即可。特别地,有一个名为pre-rebase.sample
的预重置钩子。 - user456814HEAD
通常指向类似于refs/heads/master
的内容,而不是指向master分支的最新提交。 - kostix$ git symbolic-ref 48a6c3d62b81d94ac79c3f039bfe9b924b6744f0
,得到了这个错误信息:fatal: ref 48a6c3d62b81d94ac79c3f039bfe9b924b6744f0 is not a symbolic ref
。看起来提交的SHA-1确实不是一个符号引用。这似乎是致命错误的原因,但这仍然无法解释为什么相同的虚拟示例可以正常工作。 - alexakarpov