我无法再使用git rebase --interactive

10
我在尝试对我的repo执行git rebase --interactive时遇到了严重的问题。我收到了晦涩的错误信息fatal: ref HEAD is not a symbolic ref,导致我的rebase无法正常运行。我必须运行git rebase --abort才能回到良好状态。
以下是我收到的输出:https://gist.github.com/d38f1e2d2ec9bc480b6f 过去我被告知这是因为我处于“分离头指针”模式,但如果我一开始就处于这种模式,我怎么会进入rebase呢? 我肯定是从master开始,然后运行git rebase --interactive并修改git-rebase-todo文本文件以符合我的要求。然后出现了这个错误。
我已经向我们公司的每个人以及freenode上的#git频道中的一些人询问过。没有人似乎真正理解我的问题或者知道解决方案。谷歌搜索该错误没有任何结果,有关StackOverflow的相关搜索也没有什么帮助。我似乎无法解决这个问题,而且现在从将每次提交压缩到主分支变成了将每个小更改作为单独的提交推送。

一个成功的交互式变基可以在这里找到详细描述:http://davidstechtips.com/2011/03/collapsing-commits-in-git/。在您的情况下,请尝试 git checkout master <仍然存在的先前提交>,例如 8bbfbba?或者您没有在冲突后执行 git rebase --continue 命令? - VonC
1
可能是您仍然处于之前的变基中,在重新处理期间分离了头部。在修复当前交互步骤的热情中,这很容易发生,并且您可能会分心。我刚刚通过一个变基进行了工作,在其中我有很多工作(许多小步骤)要做,但最终为每个步骤都执行了单独的 rebase -i,以便我不会迷失方向。启动 git-gui 和 gitk 可视化工具也会有所帮助。[确保您正在本地分支中的一个自己的分支上开始] - Philip Oakley
您可以通过查看.git / HEAD的内容来确定是否实际处于分离HEAD模式。如果它包含类似“ref:refs / heads / ...” 的文本,则您不处于分离HEAD模式。另一方面,如果它包含SHA-ID(例如字母和数字的混乱字符串),则确实处于分离HEAD模式。 - Daniel Kessler
2个回答

4

在进行 'git rebase' 操作时,你正在重定向的引用被检出。如果该引用是一个提交,则会得到一个分离的 HEAD;如果它是一个分支引用,则该分支将被检出。如果在提交过程中发生 FATAL 错误,则会导致工作目录处于混乱状态。例如,如果你在分支 Foo 上,并尝试从 Bar 进行 rebase 操作,在发生 FATAL 错误后,你将处于 Bar 或者 Bar 之后的某个位置,并应用了几个 rebase 提交。你可以通过简单地检出 Foo 来恢复。

git rebase --abort 

或者,如果变基真的陷入僵局(参见下面的参考文献),可以选择:

git checkout -f Foo

在此之后,您可以安全地再次尝试rebase以尝试调试FATAL错误的原因。 这里是一个情况,在内存不足时rebase失败,并且'git rebase --abort'无法正常工作。


1
使用 git checkout -f 无法解决我的问题。每次我都在使用 git rebase --abort 来退出重置操作。当我尝试使用 git checkout -f 时,这是我得到的结果:https://gist.github.com/4d3aa867602f1e438e9b - tubbo
这是因为我使用了 git-tracker。抱歉! - tubbo
使用“git rebase --abort”是首选方法,但它并不总是有效(请参见参考文献)。 - GoZoner

0

git rebase --abort 对我没有起作用。尽管rebase输出已经提供了解决方案:

fatal: It seems that there is already a rebase-merge directory, and
I wonder if you are in the middle of another rebase.  If that is the
case, please try
        git rebase (--continue | --abort | --skip)
If that is not the case, please
        rm -fr ".git/rebase-merge"
and run me again.  I am stopping in case you still have something
valuable there.

也就是说,在运行了rm -fr ".git/rebase-merge之后,一切恢复正常。


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