【问题标题】:Getting an error when trying to run `git rebase --continue`, cannot lock ref 'refs/heads/Head-feature'尝试运行 `git rebase --continue` 时出错,无法锁定 ref 'refs/heads/Head-feature'
【发布时间】:2022-01-12 00:12:34
【问题描述】:

我正在运行命令 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

我发现克服这个问题的唯一方法是执行git rebase --abort,但随后我失去了在交互式 rebase 期间所做的所有更改。有什么想法吗?

【问题讨论】:

  • 当您git rebase --continue 时,您是否总是会出现这种情况? #1顺利吗?它带有一些验证。您可以尝试从磁盘手动删除refs/remotes/origin/HEAD-feature,然后再次删除git fetch
  • 它似乎运行良好,但我仍然遇到git rebase --continue的问题
  • 您是否尝试手动删除 refs(不使用 git update-ref)并再次获取?
  • hm,在我的情况下,我的 ref 仅在本地可用,我还没有把它放到远程。我尝试做git reset HEAD^ 来删除更改并将它们隐藏然后git rebase --continue 但它似乎有同样的问题
  • 啊哈,好吧。感到困惑,因为您的命令涉及origin。问题只是 this rebase 还是一般问题? “无法锁定 ref”通常意味着 .git/refs 文件夹的某种一般损坏。

标签: git


【解决方案1】:

您或某个流氓进程以与git rebase 冲突的方式弄乱了您的回购状态

错误消息表明您或其他人或某事对您的回购状态做了一些事情 - 在 rebase 进行时您不能这样做。它期望一个 ref 指向一个特定的提交,但它从它下面被改变了。

如何恢复

以下是如何在不丢失所有 rebase 工作的情况下从这种情况中恢复的方法(假设您尚未中止):

  1. 要保存到目前为止的 rebase 进度:

    git branch PARTIAL-REBASE head
    

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

    您必须在之前 git rebase --abort 执行此操作,否则您将不得不搜索 reflogs 以恢复您的部分变基,这更复杂。

  2. 中止变基。

    git rebase --abort
    
  3. 要恢复你的变基,你会告诉 git 变基 remaining 提交(即由于中止而没有发生的那些)。您可以通过指定序列中的第一个和最后一个来做到这一点。第一个将是 git 将恢复变基的提交。最后一个将是您正在变基的分支的引用,来自您原来的 rebase 命令。

    git rebase --onto PARTIAL-REBASE <hash of first un-rebased commit> <name of branch being rebased>
    

    要找出 first un-rebased commit 提交是什么,请查看历史记录并比较您正在变基的分支和 PARTIAL-REBASE 分支中的提交消息。您将看到直到中止点,它们都有一组并行的匹配提交(基于消息)。第一个不在PARTIAL-REBASE 中的是你的first un-rebased commit

  4. 仅当您确定您的 rebase 成功并且一切正常时,删除 PARTIAL-REBASE 参考:

    git branch -D PARTIAL-REBASE
    

另请参阅 How to fix "corrupted" interactive rebase?Git rebase failing,尽管我很惊讶没有人提供像我这样的“如何恢复”解决方案。

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 2020-09-21
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2012-06-29
    • 2017-12-07
    相关资源
    最近更新 更多