删除远程和本地文件夹上删除的git recover分支

时间:2013-10-25 14:15:47

标签: git branch

我失去了一些工作,我试图恢复它。基本上我在本地创建了一个分支,提交,推送,然后做了一些清理并在本地,远程和本地包含项目的目录中删除了分支(我以为我总是可以随时克隆它)。我不知道为什么我忘了与“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

英语不是我的母语,如果需要,我可以澄清任何观点/编辑我的问题。提前感谢帮助我找到除了跳出窗外的解决方案

1 个答案:

答案 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存储库。