git - 不小心删除了repo所基于的分支,如何修复?

标签 git

我已经删除了我重新建立基础的分支。我认为解决方案可能是 checkout 到 master,然后获取远程分支并继续工作,但我收到此错误,

notice: HEAD points to an unborn branch

如何解决这个问题?

最佳答案

由于这种原因,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 时存在一些错误,并且有多种方法可能会给自己带来问题,但 gitbranch 本身应该是这样的 在这里直接说“不”。)成功后,您将得到:

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

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

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

git branch feature/branch_1 origin/feature/branch_1

例如。但是,如果没有这样的其他名称,则不起作用。

幸运的是,HEAD 有一个 reflog,并且 HEAD reflog 存储您访问过的提交的原始提交哈希值。不幸的是,在这种状态下,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

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

关于git - 不小心删除了repo所基于的分支,如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55224809/

相关文章:

git - AzureDevOps YAML管道存储库资源 `ref`回退

git - 为什么 "Compare with Unmodified"在 Visual Studio 2017 中不起作用?

git - 本地分支机构与集市?

Git:从源代码控制的文件中删除回车符

git - 似乎无法放弃 Git 中的更改

git - 在git中获取父源分支的名称?

java - JGit:如何压缩提交

git - Bitbucket 存储库从昨天开始返回 "remote: Too many invalid password attempts. Try logging in through the website."(403)

git - 如何删除 "origin/origin/master"

java - 使用包的 Eclipse 问题