git中的分支已断开,致命:您当前的分支似乎已断开

git中的分支已断开,致命:您当前的分支似乎已断开,git,git-branch,fatal-error,git-log,blue-screen-of-death,Git,Git Branch,Fatal Error,Git Log,Blue Screen Of Death,我的情况如下: 我在一家分行工作 将新提交推送到远程服务器 切换回主分支 但在键入git checkout master命令后,我的计算机突然遇到了一个意外的强制关闭。启动计算机后,我检查了当前分支机构的状态,因此我将每个文件都标记为新文件 现在,我被困在这一点上,在执行git log命令之后,我得到了一个错误 $ git log fatal: your current branch appears to be broken 如何解决此问题并恢复我的分支 我正在使用Windows7和Git

我的情况如下:

  • 我在一家分行工作
  • 将新提交推送到远程服务器
  • 切换回主分支
但在键入git checkout master命令后,我的计算机突然遇到了一个意外的强制关闭。启动计算机后,我检查了当前分支机构的状态,因此我将每个文件都标记为新文件

现在,我被困在这一点上,在执行
git log
命令之后,我得到了一个错误

$ git log
fatal: your current branch appears to be broken
如何解决此问题并恢复我的分支

我正在使用Windows7和GitBash的最新版本

编辑:我不想删除此分支。


我在Windows7上遇到了类似的问题。在我的例子中,
\.git\refs\heads
下的当前分支文件(请参见
/git/HEAD
)已损坏

我在
.git\logs\refs\heads
上找到了断开的当前分支的哈希代码,该代码具有相同的分支名称


我通过记事本打开文件(
.git\logs\refs\heads\xxx
)并将第四个数字(散列码)复制到(
.git\refs\heads\xxx

您的分支名称现在可能包含一些特殊字符或类似的内容

您应该转到签出的根目录(即
.git/
目录),然后

  • 列表项编辑
    .git/packed refs
    ;如果看到带有分支名称的行,请将其删除
  • .git/refs/heads中查找以您的分支命名的文件;如果你
    看到一个,删除它

  • .git\refs\heads目录中的文件是您的分支。 检查那些文件。它们应该只包含一个提交对象SHA-1哈希。这个散列是您的最新SHA-1密钥,同时也是您的头

    复制SHA-1键并键入

    $ git cat-file -t 5917fefd485f655ab369d4e9eeda3c157c03f514
    commit
    
    $ git cat-file -p 5917fefd485f655ab369d4e9eeda3c157c03f514
    tree b75cab3c54b780075b312be3e878b389a2baf904
    parent 8235189aa22169295243d295fb1cc2ff2f8f7cd5
    author Ilker Cat <ilker.cat@blabla.com> 1495136738 +0200
    committer Ilker Cat <ilker.cat@blabal.com> 1495136738 +0200
    
    $git cat文件-t 5917FEFD485F655AB369D4E9EEDA3C15C03F514
    犯罪
    $git cat文件-p 5917fefd485f655ab369d4e9eeda3c157c03f514
    树B75CAB3C54B780075B312BE878B389A2BAF904
    父级8235189aa22169295243d295fb1cc2ff2f8f7cd5
    作者Ilker类别1495136738+0200
    提交人Ilker类别1495136738+0200
    
    第二个输出是提交对象基本上包含的内容。尝试检查主分支中.git\refs\heads\master下的提交对象及其树和父SHA-1键是否未损坏


    甚至主分支文件中的一些撇号也会导致“断开的分支”。它必须只包含最新提交对象SHA-1哈希,而不包含其他内容。

    有时也可能由于文件权限问题而出现此问题,请检查您是否对存储库下的所有文件都具有适当权限。

    也有同样的问题。
    删除.git\refs\heads\修复了我的问题。

    如果尝试将分支重命名为命名空间(或文件夹)分支,可能会遇到此错误

    如果发生这种情况,请转到目录
    .git/logs/refs/heads/
    .git/refs/heads/
    ,您将看到您的分支现在是一个文件夹,其中包含一个文件


    在这两个文件夹中,将文件移出到文件夹级别,签出该分支,删除现在为空的文件夹,现在您应该能够执行
    git checkout-b/
    而不会出错,或者
    git branch-M/

    我通过将repo克隆到一个新文件夹,然后替换更改的文件来解决这个问题。这似乎不是一个好的解决方案,但它是安全的

    在5月份的情况下,使用记事本打开在
    找到的以我的分支名称命名的文件后,
    为空。所以我把它删掉了

    并运行以获取最新的提交

    git reflog
    
    4404dd7头@{0}:提交:更新自述文件

    然后我就跑

    git reset --hard 4404dd7 
    
    HEAD现在位于4404dd7更新自述文件

    布兰奇回来了。 注意

    这可能会分散你的注意力。因此,您可能需要稍后修复它们


    4404dd7是我在该分支中的最新提交,我不知道这是否是正确的解决方案,但它对我起了作用。

    我也有同样的问题。我刚刚删除了
    .git/refs/heads
    中的所有文件, 然后我试图编辑我的一个文件,以便git接受提交。然后,当我推送文件时,出现以下错误:

    10:47推送被拒绝 推送已取消,因为更新期间存在冲突。 检查冲突是否已正确解决,然后再次调用推送


    但是,我在合并文件时接受了rebase选项,解决了这个问题,没有冲突。

    好的,对于这个问题,我发现, 如果您返回并克隆您的repo,您所要做的只是从新repo复制.git文件夹,并替换旧repo中的.git文件夹


    剩下的就是历史:运行git add。然后git提交并推送。

    文件的内容是什么
    .git/HEAD
    ?它是否指向有效的分支名称?分支名称是否指向有效的提交散列?是的,正确,但在本例中,我是唯一的用户;拥有所有的权利!。git文件夹隐藏在我的箱子里,请自行查看。谢谢!我发现检查提交散列也很有用,以查看它是否是我想使用
    git checkout
    还原的状态(在将其复制到
    git/refs/heads/xxx
    之前)。谢谢,它起到了作用。我将上一个提交哈希表.git\logs\refs\heads\xxx复制到.git\refs\heads\xxx。日志中有两列哈希代码,第二列的最后一个条目是我的最后一次提交。非常感谢,这很有效。总有一天,我会仔细研究git的内部结构,它似乎只把我的文件当作“所有文件都是新的”来对待,在这样做之后:\真是太感谢你了。差点心脏病发作!我希望我能理解这为什么有效,但它确实有效。(我没有尝试重命名我的分支,我的电脑在拉操作中崩溃了)