2013-07-19 41 views
44

我正在使用源代码树。我创建了一个多个更改的存储,并将其删除。有没有办法找回他们?使用SourceTree在Git中检索已删除的存储

+0

Windows还是Mac? Mac版本在功能方面一直领先于Windows版本。 – 2014-05-05 04:13:35

+2

可能相关:[在git中恢复丢弃的存储](http://stackoverflow.com/q/89332/456814)。 – 2014-05-05 04:15:27

+0

@Cupcake我一直在使用Mac版本。 – Tushar

回答

40

隐藏在内部被保存为一个合并提交,从一个列表中引用。

git fsck可以找到悬挂的物体。它会发现不仅仅是你删除的隐藏,也可能是其他的东西,所以你会想要寻找提交,看起来他们可能是你的存储(git show <ID>显示有关对象的相关信息,并决定它是否是一个你正在寻找)。

一旦你有了,你需要做的就是重新插入它的列表中。该列表存储在.git/logs/refs/stash和行具有以下格式:

<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash> 

这里有一个工作示例:

16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <[email protected]> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4 

就合成了藏匿要行重新插入(名称/邮件/时间戳/描述不要是准确的),你应该能够正常使用它。

快乐狩猎!

+0

我运行'''git fsck'''命令,它给了我大约100个GUID。有没有更简单的方法来解决这个问题?我的意思是更多的视觉? – Tushar

+0

它不可能通过100 guids!请建议一个更简单的方法。 – Tushar

+3

这是我知道的唯一方法。但是,你可以使用下面的方法减少它:'git fsck --unreachable';并直接得到一个清单的细节,可能是这样的:'for i in $(git fsck --unreachable --no-dangling 2> |/dev/null | grep commit | cut -d''-f3);做git - 无记录器日志-1 $ i;完成|少' –

20

像以前的答案状态一样,您可以使用git fsck来列出 未被包含您删除的藏匿物的任何物品引用的物品。但是,它 可以使用git show筛选对象的该列表仅显示 藏匿处,如:

git fsck 2> /dev/null | 
    awk '/commit/{print $3}' | 
    git show --stdin --merges --grep '^WIP on' 

如果您知道创建藏匿时,你还可以添加一个参数像 --since '2 days ago'到最后以进一步限制输出。希望这会将名单减少到可管理的规模。

找到正确的存储后,记下它的提交ID,并且可以使用 git stash apply COMMITID来应用它,就像它没有被删除一样。

+2

“since”选项对我来说不起作用 – IcedDante

9

正如JanKrüger所述,git fsck就是要走的路。但是,如果您发现自己无法(无论出于何种原因)成功合成存储文件中的一行并使存储显示在可用列表中,则可以直接使用git stash apply <guid>,而不添加该行。这将立即应用(不提交)文件(s)更改到您当前的分支。

52

基于上述答案,这里是一个简单的序列:

打开一个终端窗口和CD到存储库下的文件夹。然后:

git fsck | awk '{print $3}' > tmp.txt 
cat tmp.txt | xargs git show > tmp2.txt 

编辑器现在打开tmp2.txt,找到丢失的代码,并找到提交-ID在它的上面。然后应用代码:

git stash apply <commit id> 
rm tmp.txt tmp2.txt 

这救了我的命!我真的很感谢所有回答这个问题的人。我保佑git的创造者Linus Torvalds保留删除的东西在git数据库。天才!!

+0

我对git相当陌生,这绝对挽救了我的生活,恢复了工作的日子。谢谢 – RyuAkamatsu

+0

我同意。我只是按照这些步骤,并在我无意中删除(弹出)存储后恢复了3天的工作。 – bholben

+0

我见过最好的答案。感谢捆绑! – Andrew

1
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less 

然后找到提交ID#。

,做

git stash apply {commit#} 
4

另一种解决方案是:

git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log 

您是否使用SourceTree用于查找作者和提交信息(日期,哈希,作者等)

git stash store <hash-id-of-specific-commit> 
+0

我试了几个脚本,但这个工作没有错误或给我随机/ n数据。 – Zammbi