我失去了一些工作,我试图恢复它。基本上我在本地创建了一个分支,提交,推送,然后做了一些清理并在本地,远程和本地包含项目的目录中删除了分支(我以为我总是可以随时克隆它)。我不知道为什么我忘了与“dev”合并。
我查看了我的bash历史,看看会发生什么,我想我可以弄清楚执行了什么命令(见下文)。
我一直在寻找有关此问题的答案,发现了大量但没有效果(甚至是有前途的fsck / reflog)
基本上这似乎发生了(2周前):
git clone ssh://.../myproject
cd myproject
git checkout dev
vim hello
git commit -m "new commit"
git push origin dev
git checkout -b newbranch
vim blabla
git add blabla
git commit -m "new commit"
git push
git checkout dev
git push origin --delete newbranch
git branch -d newbranch
cd ..
rm -rf myproject
英语不是我的母语,如果需要,我可以澄清任何观点/编辑我的问题。提前感谢帮助我找到除了跳出窗外的解决方案
答案 0 :(得分:1)
当您删除分支(git branch -d ...
)时,它会删除分支名称(指向提示提交的指针)和分支的reflog。然而,在进行垃圾收集之前,提交本身会持续一段时间,通常是大约三个月,因为它们仍然被其中一个reflog引用,HEAD
。
因此,通常你会运行git log -g
(或使用图形查看器来查看HEAD
reflogs)并搜索你在newbranch
上做的最后一次提交。例如,您可能会看到如下内容:
commit e1189656a60f446de5b40137e8149f4bf5635986
Reflog: HEAD@{66} (You <your.name@your.email.addr>)
Reflog message: commit: Frobble the minifier
...
如果这是正确的提交,那么:
git branch newbranch e1189656a60f446de5b40137e8149f4bf5635986
将把分支标签放回去。
您将上面的最后两个命令引用为:
cd ..
rm -rf myproject
这将删除整个克隆,包括myproject/.git
,其中git保留了repo对象和reflog。
当目录myproject
存在时,可能会在某个时刻制作备份。本地克隆的本地备份可能包含您要恢复的大部分或全部内容。
如果没有,那么,你这样做了:
git clone ssh://.../myproject
...
git push
让我们为这台机器(ssh://
的目标)提供一个名称O
作为原点。
如果一切顺利,推送会将提交及其树和文件复制到O
并在newbranch
上设置分支标签O
,指向最尖端的提交。后来push --delete
删除了分支标签。不幸的是......好吧:
假设您可以登录O
并在那里的myproject
git存储库中查找。您可能会尝试查看他们的 reflogs(假设他们有)。唉,git push --delete
会删除分支newbranch
的reflog,这是推文本身可能被记录的唯一地方。
接下来,您可以尝试在那里运行git fsck
并查找“悬空提交”。根据上面的评论,你已经做到了这一点并没有得到任何结果,这意味着git已经进行了垃圾收集传递并删除了提交对象,因此也删除了你正在寻找的其他所有内容。
(1)备份很好。检查备份。
(2)如果可以避免,请不要rm -rf
你的git存储库。