以下是我的案例:
但是在键入git checkout master
命令后突然我的计算机遇到了blue screen of death并且发生了意外的强制关闭。在重新启动计算机后,我检查了当前分支的状态,结果我将每个文件都标记为新文件。
现在,我陷入困境,在git log
命令后我遇到了错误
$ git log
fatal: your current branch appears to be broken
如何解决这个问题并恢复我的分支?。
我正在使用Windows 7和git bash最新版本
修改:我不想删除此分支。
答案 0 :(得分:20)
我在Windows 7上遇到了类似的问题。就我而言,./git/HEAD
下的当前分支文件(由\.git\refs\heads
引用)已被破坏。
我在.git\logs\refs\heads
上找到了具有相同分支名称的当前分支的哈希码。
我通过记事本打开该文件(.git\logs\refs\heads\xxx
)修复了该问题,并将第4个数字(哈希码)复制到(.git\refs\heads\xxx
)
答案 1 :(得分:8)
.git \ refs \ heads目录中的文件是您的分支。 检查这些文件。它们应该只包含一个提交对象SHA-1哈希。这个哈希是你最新提交的SHA-1密钥和你的HEAD。
复制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 \ refs \ heads \ master下的master分支中的commit对象是否及其树和父SHA-1密钥没有损坏。
即使主分支文件中的一些撇号也会导致“断开的分支”。它必须只包含最新的提交对象SHA-1哈希,而不包含任何其他内容。
答案 2 :(得分:6)
如果您尝试将分支重命名为命名空间(或文件夹)分支,则可能会遇到此错误。
如果发生这种情况,请转到目录.git/logs/refs/heads/<name>
和.git/refs/heads/<name>
,您将看到您的分支现在是一个文件夹,里面有文件。
在这两个文件夹中,将文件移出到文件夹的级别,签出该分支,删除现在空的文件夹,现在您应该能够无误地执行git checkout -b <name>/<subname>
或git branch -M <name>/<subname>
。
答案 3 :(得分:2)
您的分支名称现在可能包含一些特殊字符或类似字符。
您应该转到结帐的根目录(.git/
目录所在的位置)和
.git/packed-refs
;如果您看到包含您的分支名称的行,则将其删除.git/refs/heads for
中查找以您的分支命名的文件;如果你
看一个,删除它答案 4 :(得分:2)
有些时候也可能由于文件权限问题而发生,请检查您是否对存储库下的所有文件具有适当的权限。
答案 5 :(得分:1)
有同样的问题。 删除.git \ refs \ heads \为我解决了这个问题。
答案 6 :(得分:1)
在使用记事本打开以.git\logs\refs\heads\<MY-CORRUPTED-BRANCH>
找到的我的分支名称后命名的文件的情况下,可能是空的。所以我删除了它。
并运行以获取最新提交
git reflog
4404dd7 HEAD @ {0}:提交:更新自述文件
然后我跑
git reset --hard 4404dd7
HEAD现在位于4404dd7更新自述文件
分支又回来了。 注意
这可能会使您的分支有所分歧。因此,您稍后可能需要修复它们。
4404dd7是我在该分支机构中的最新提交,我不知道这是否是正确的解决方案,但这对我还是有用的。
答案 7 :(得分:0)
我通过将存储库克隆到新文件夹并替换更改的文件来解决该问题。似乎不是一个好的解决方案,但是很安全!
答案 8 :(得分:0)
我有同样的问题。我刚刚删除了.git/refs/heads
中的所有文件,
然后我尝试编辑我的文件之一,以便git接受提交。然后,当我推送文件时,出现此错误:
10:47推送被拒绝 推送已取消,因为更新期间存在冲突。 检查冲突是否已正确解决,然后再次调用push。
但是,我通过合并文件时接受rebase选项解决了这一问题,没有冲突。
答案 9 :(得分:0)
好的,这个问题,我发现, 如果您返回并克隆您的存储库,您只需从新存储库复制 .git 文件夹并替换旧存储库中的 .git 文件夹。
剩下的就是历史:运行 git add 。然后 git commit 和 push。