首页 > 解决方案 > 不小心删除了 repo 所基于的分支,如何修复?

问题描述

我已经删除了我重新建立的分支。我在想解决方案可能是结帐到master,然后获取远程分支并继续工作,但是我收到了这个错误,

notice: HEAD points to an unborn branch

如何解决这个问题?

标签: git

解决方案


由于这种原因, Git 通常不允许您删除您所在的分支。

这里最基本的问题是分支名称包含提交哈希 ID。也就是说,根据您的评论,您这样做了:

git checkout feature/branch_1

这把名字feature/branch_1变成了特殊的名字HEAD。名称本身,即 ,feature/branch_1包含分支提示的 40 个字符的哈希 ID,因此该名称记住了实际的提交哈希。

然后你跑了:

git branch -d feature/branch_1

Git 应该说不,你可能不会那样做。(使用时有一些错误git worktree add,并且有多种方式可以给自己造成问题,但git branch它本身应该在这里说不。)当这成功时,你会得到:

  • HEAD包含feature/branch_1
  • feature/branch_1不存在。

修复它的方法是重新创建名称feature/branch_1,同时将正确的提交哈希 ID 放入其中。问题是它没有记忆它应该持有哪个提交哈希:该哈希 ID存储name 下,现在feature/branch_1不再存在。

那么,您需要一些替代方法来查找此哈希 ID。一种方法是,如果有另一个名称存储了正确的哈希 ID,您可以从该其他名称读取哈希 ID:

git branch feature/branch_1 origin/feature/branch_1

例如。但是,如果没有这样的其他名称,那就行不通了。

幸运的是,HEAD有一个reflog,并且HEADreflog 存储了您访问过的提交的原始提交哈希。不幸的是,在这种状态下,看起来 Git 拒绝使用它:

$ git reflog HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.

和:

$ git rev-parse HEAD@{0}
HEAD@{0}
fatal: ambiguous argument 'HEAD@{0}': unknown revision or path not in the working tree.

但是,这可以解决问题:

$ tail -1 .git/logs/HEAD | awk '{print $2}'
b5101f929789889c2e536d915698f58d5c5c6b7a

所以你可以在这种特殊情况下使用这个特殊的技巧(否则无论如何都不应该发生)。


推荐阅读