交互式Git rebase过程中出现“fatal: ref HEAD is not a symbolic ref”错误。

18

我有三个提交记录 - 一个是正常的,另外两个是无关紧要的清理工作,比如打字错误等。所以我想将它们压缩成一个提交记录。开始吧:

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确实有一些)。谢谢您考虑回答这个问题!


4
如果你认为钩子可能会有问题,你可以尝试关闭它们。这些钩子位于.git/hooks/目录下,只需将它们重命名为<hook>.off即可。特别地,有一个名为pre-rebase.sample的预重置钩子。 - user456814
感谢建议-钩子现在有点神秘了..它对问题没有任何影响,但至少杀死了一个误导) - alexakarpov
2
在Git中,“symbolic ref”与文件系统上的符号链接无关:“ref”在Git术语中是指指向提交(分支或标签)的实体;这是“reference”的缩写。一个ref可能直接指向一个提交的SHA-1名称(这时它是直接的),也可能指向另一个ref,这时它就是“symbolic”的。例如,HEAD通常指向类似于refs/heads/master的内容,而不是指向master分支的最新提交。 - kostix
1
感谢@kostix,我甚至没有注意到我误引用了git,在“符号链接”中使用了“符号引用”。因此,当由于“git checkout some_commit_SHA1”而进入分离的HEAD时,cat .git/HEAD正好打印出该SHA1;如果我检出一个分支,则会打印类似于'ref:refs/heads/master'的内容。所以我的理解是,后者是一个符号引用——但是提交的SHA-1是否是符号引用呢?它肯定是一个引用——看起来像是直接引用,引用你的话,就是一个“直接”的引用。如果是这样,那么它就清楚了一些混淆——但并不能解释为什么在某些情况下会导致致命错误,而在其他情况下则不会... - alexakarpov
1
运行了这个命令:$ git symbolic-ref 48a6c3d62b81d94ac79c3f039bfe9b924b6744f0,得到了这个错误信息:fatal: ref 48a6c3d62b81d94ac79c3f039bfe9b924b6744f0 is not a symbolic ref。看起来提交的SHA-1确实不是一个符号引用。这似乎是致命错误的原因,但这仍然无法解释为什么相同的虚拟示例可以正常工作。 - alexakarpov
3个回答

6

你的"work"仓库可能出了些问题。详情请参见我无法再使用git rebase --interactive

建议在你的"work"仓库中运行git status以查明情况。接下来可能需要使用git rebase --abortgit merge --abort或类似的命令。

也可以运行git fsck

当你的仓库和工作目录都正常后,交互式的rebase应该能正常工作。另外请注意,如果你想编辑仓库的第一个提交,可能需要使用git rebase --root --preserve-merges ...命令。


3

也有可能执行了 git commit 而不是 git rebase --skipgit rebase --continue

这可能会添加不需要的提交记录。

您可以运行 git reset HEAD~1,然后执行 git rebase --continue 以解决此问题。


0

当我在分离的 HEAD 上尝试推送标签时,出现了这个错误。

@❯ git push origin 1.1.1
fatal: ref HEAD is not a symbolic ref
error: failed to push some refs to '<repo>'

由于主分支比带有标签的提交领先一个提交,因此出现了分离头。

我可以通过暂时将主分支重置为标签所在的提交来推送标签:

@❯ git checkout develop
@❯ git reset --hard @~
@❯ git push origin 1.1.1
@❯ git reset --hard origin/develop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接