0

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

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

4

1 回答 1

1

背景

当您删除一个分支 ( git branch -d ...) 时,它会删除分支名称(指向提示提交的指针)和分支的引用日志。然而,提交本身会保留一段时间,通常是大约三个月,然后才会被垃圾收集,因为它们仍然被其中一个 reflog 引用,即HEAD.

因此,通常您会运行git log -g(或使用可让您查看HEADreflogs 的图形查看器)并搜索您在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/.gitgit 保存 repo 对象和 reflog 的位置。

那么还有哪些选择呢?

myproject也许在目录存在时的某个时候进行了备份。本地克隆的本地备份可能包含您想要恢复的大部分或全部内容。

如果没有,那么,你这样做了:

git clone ssh://.../myproject
...
git push

让我们给这台机器( 的目标ssh://)一个名字,O作为起源。

如果一切顺利,推送会将提交及其树和文件复制到并在 上O设置一个分支标签,指向最尖端的提交。后者删除了分支标签。不幸的是......好吧:newbranchOpush --delete

假设您可以在那里登录并在git 存储库中O四处寻找。myproject您可能会尝试查看他们的reflogs(假设他们有)。唉,git push --delete会删除分支的 reflog newbranch,这是唯一可能记录推送本身的地方。

接下来,您可以尝试在git fsck那里运行并寻找“悬空提交”。但是,根据上面的评论,您已经这样做了,但一无所获,这意味着 git 已经完成了垃圾收集传递并删除了提交对象,因此也删除了您要查找的所有其他内容。

外卖

(1) 备份是好的。检查备份。

rm -rf(2)如果可以避免,请不要使用 git 存储库。

于 2013-10-25T18:33:53.540 回答