我怎样才能从'致命中恢复:引用不是树:主'?

时间:2014-10-29 14:18:53

标签: git git-branch

我有一个git文件夹,它有两个分支,masterworking

由于我无法解释的原因,当我运行git branch命令时,我得到三个分支:

  • desktop.ini
  • master
  • working

working分支是最新的(重置后),并且具有我想要的内容。

desktop.ini分支不应该存在。我跑的时候

git branch -d desktop.ini

它表示它不存在且无法删除。它也无法结账。 Git仓库中的每个文件夹中都有一个desktop.ini文件,因为它是存储仓库的Google云端硬盘文件夹。

然而,主要问题是我无法再访问master分支。每次我尝试

git checkout master

我回来了

fatal: reference is not a tree: master.

如果我尝试删除它,我会

error: couldn't look up commit object for refs/heads/master

手动检查此文件确实存在于正确的目录中,并且其中有一个头。

我还尝试创建一个新的master分支,但是被告知一个名为" master"已经存在。最后,运行git log提供了最新的提交,然后是

error: could not read c7d68...blah blah
fatal: failed to traverse parents of commit aed8af.....

有没有简单的方法来复苏master分支?

更新:将头部从工作分支复制到主分支,我现在可以再次访问主分支。但是每git status次返回

error: could not read c7d68.....
error: could not read c7d68.....
fatal: Failed to traverse parents of commit aed8......

我需要采取行动纠正这个问题吗?

1 个答案:

答案 0 :(得分:1)

我今天早上遇到了这个问题。在我的情况下,我在Windows主机上运行Ubuntu VM。 Ubuntu VM用于开发,但我正在使用的文件实际上位于从主机操作系统共享的目录中。 Windows是,因为它不会这样做,将desktop.ini文件添加到共享目录中的所有目录...包括.git目录及其所有子目录。 Git在不期望第三方操纵内容的地方看到这些文件;所以当我执行“git branch”时,我得到的列表与提问者的列表非常相似。

这里的关键是这些显然不是真正的分支。它们只是Git期望能够对目录内容进行简单枚举的地方的文件,以便找到存在的分支。当你尝试做一些更实质的事情,比如删除这个新的desktop.ini分支时,它会失败,因为它不是真正的分支。

我通过删除Windows中添加到.git目录结构的所有desktop.ini文件来解决这个问题。一旦我这样做了,幻影分支就消失了,一切正常(因为git-flow在.git / refs / release中将文件作为当前版本的进展分支),因此它在我的情况下搞砸了git-flow。如果我继续在Windows主机文件系统中托管这些文件,我确实希望这些文件能够回来...可能有一种更永久的方法来阻止这种情况,但我还没有到达那里。