尝试运行“git rebase --continue”时出现错误,无法锁定引用“refs/heads/Head-feature”

use*_*121 10 git git-rebase

我正在运行命令git rebase --continue并收到错误:

error: update_ref failed for ref 'refs/heads/HEAD-feature': cannot lock ref 'refs/heads/HEAD-feature': is at db50dd34de1e90c0616bf9318be489ee8d9a012a but expected 83f09532b2352418c0f562f48929dc504e6a0452 error: could not update refs/heads/HEAD-feature

我查看了几个类似的问题,但没有一个答案有效。

我尝试了以下方法:

1. git update-ref -d refs/remotes/origin/HEAD-feature
2. git --no-optional-locks fetch --prune origin
3. git gc --prune=now
4. git remote prune origin
Run Code Online (Sandbox Code Playgroud)

我发现克服这个问题的唯一方法是这样做git rebase --abort,但随后我会丢失在交互式变基期间所做的所有更改。有任何想法吗?

vas*_*vas 14

您或某些流氓进程以与以下内容相冲突的方式扰乱了您的回购状态git rebase

该错误消息表明您或其他人或某些东西对您的存储库状态做了某些操作,而在变基正在进行时您无法执行此操作。它期望引用指向特定的提交,但它从它下面被更改了。

如何恢复

以下是如何在不丢失迄今为止所有变基工作的情况下恢复的方法(假设您尚未中止):

  1. 保存到目前为止的变基进度

    git branch PARTIAL-REBASE HEAD
    
    Run Code Online (Sandbox Code Playgroud)

    这将创建一个名为PARTIAL-REBASE指向最后一次变基提交的分支引用——即到目前为止您的变基工作。

    您必须在之前 git rebase --abort执行此操作,否则您将不得不搜索引用日志来恢复部分变基,这会更加复杂。

  2. 中止变基

    git rebase --abort
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从中断处恢复 rebase

    有很多方法可以做到这一点,但这是最简单的。

    首先查看您保存的部分变基中包含哪些提交:

    git log PARTIAL-REBASE
    
    Run Code Online (Sandbox Code Playgroud)

    确保您位于正确的分支上,然后重新运行原始 rebase 命令,但将以下选项添加到命令中:

    --onto PARTIAL-REBASE --interactive 
    
    Run Code Online (Sandbox Code Playgroud)

    编辑器中将显示对变基的提交列表。小心地仅删除上述 git 日志中已包含的提交行PARTIAL-REBASE。除非您知道自己在做什么,否则请勿进行任何其他更改。

    保存并关闭变基列表。变基列表中的提交现在将被变基 PARTIAL-REBASE,从而有效地在您中止变基时恢复变基。

  4. 验证和清理

    验证您的 rebased 分支是否良好。

    当您确定变基成功且一切正常时,请删除PARTIAL-REBASE引用:

    git branch -D PARTIAL-REBASE
    
    Run Code Online (Sandbox Code Playgroud)

另请参阅如何修复“损坏的”交互式变基?Git rebase failed,尽管我很惊讶没有人给出像我这样的“如何恢复”解决方案。