使用SourceTree检索Git中已删除的存储
我正在使用源代码树。 我创build了一个多个更改的存储,并将其删除。 有没有办法找回他们?
存储在内部被保存为一个从一个列表中引用的合并提交。
git fsck
可以find悬挂的对象。 它会发现不仅仅是你删除了隐藏,但也可能是其他的东西,所以你会想要寻找提交,看起来他们可能是你的藏匿( git show <ID>
显示有关对象的相关信息和决定是否是你正在寻找的那个)。
一旦你有了,你需要做的就是重新插入到列表中。 该列表存储在.git/logs/refs/stash
并且行具有以下格式:
<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <your@email.example> <UNIX timestamp> <time zone, eg +0000><TAB char><description of stash>
这是一个工作的例子:
16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <email.censored@invalid> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4
只需要合成一个你想要重新插入的存储行(名称/邮件/时间戳/描述不必是准确的),你应该可以再次正常使用它。
快乐狩猎!
基于上面的答案,这里是一个简单的序列:
打开一个terminal窗口,并进入存储库下的文件夹。 然后:
git fsck | awk '{print $3}' > tmp.txt cat tmp.txt | xargs git show > tmp2.txt
现在在编辑器中打开tmp2.txt ,find你丢失的代码,并在其上findcommit-id 。 然后应用代码:
git stash apply <commit id> rm tmp.txt tmp2.txt
这救了我的命! 我真的很感谢所有回答这个问题的人。 我保佑git的创造者Linus Torvalds在git数据库中保留删除的东西。 天才!!
像以前的回答状态一样,你可以使用git fsck
来列出那些没有被任何东西引用的对象,这些对象将包含你的被删除的藏匿处。 但是,可以使用git show
来过滤对象列表,以仅显示如下所示的内容:
git fsck 2> /dev/null | awk '/commit/{print $3}' | git show --stdin --merges --grep '^WIP on'
如果你知道什么时候被创build,你还可以在最后一行添加一个像--since '2 days ago'
这样的参数来进一步限制输出。 希望这会把名单减less到一个可pipe理的规模。
一旦你发现正确的藏匿logging的提交ID,你可以使用git stash apply COMMITID
应用,就好像它没有被删除。
正如扬·克鲁格(JanKrüger)所说的那样, git fsck
是最好的select。 但是,如果您发现自己无法(无论什么原因)成功合成隐藏文件中的一行,并使隐藏显示在可用列表中,则可以直接使用git stash apply <guid>
,而不添加该行。 这将立即应用(不提交)文件(S)更改到您当前的分支。
另一个解决scheme是
git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log
find作者和提交信息(date,散列,作者等)
git stash store <hash-id-of-specific-commit>
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less
然后find提交ID#。
并做
git stash apply {commit#}