如何在Git中搜索“丢失”文件/更改?

时间:2017-09-27 16:26:04

标签: git

我似乎弄乱了我的本地存储库。

我知道我在几周前处理的特定文件中有一些内容。在多次合并之后,提交压缩和其他类型的历史记录重写我现在注意到这个内容丢失了。我也找不到我在这里添加这些更改的提交。

我之前读过有“孤立”分支和提交的本地副本。有没有办法以某种方式搜索这些特定文件或关键字?

2 个答案:

答案 0 :(得分:1)

git fsck命令可用于列出--unreachable--lost-found的提交。

由于此时的输出难以阅读,我建议将找到的哈希值提供给git log,以便在参考其余提交时显示它们。

git log --graph --all --numstat --oneline --decorate --full-history --date-order --color <Put Refs Here>

--numstat命令将显示每次提交中哪些文件已更改,并希望帮助您找到文件/数据。

答案 1 :(得分:0)

感谢对我的问题的一些评论,我知道reflog是寻找这些提交的可能命令之一。

我通常使用GUI来使用Git(SourceTree或GitKraken),所以我在命令行上有点迷失。从理论上讲,我知道如何找到这些文件:git reflog,然后可能git show来获取更改文件和差异来筛选所有这些文件(我确定有更好的方法可以这样做,但我没有使用CLI的经验。但是,由于我在上个月没有想到 ,我做了这些更改以及丢失的地方,这看起来不像我的解决方案。

经过一些谷歌搜索后,我找到了SmartGit。它是另一个git GUI,但它实际上支持显示这些丢失的提交及其上下文。以下是我在blog post中写下的指示:

  

我们正在“Log”视图中寻找“Recyclable Commits”分支:在SmartGit中打开存储库,右键单击“Repositories”面板中的存储库,在上下文菜单中选择“Log”,然后在打开“Log”视图,在“Branches”面板中选择“Recyclable Commits”,另外选择已选择的分支或“HEAD”:

     

example of "recaclyble commits" output

     

浅橙点条目(相对于粗体黑点条目)是“孤儿”,不再是当前树的一部分。

     

您可以使用“过滤器”输入过滤掉这些内容,可以选择搜索文件名甚至文件内容! (所以我可以输入我知道我已经把我的内容放入的文件名,只查看这些相关的提交 - 甚至搜索我知道我在文件中写过的几个字 - 这真是太棒了!)

     

重要且非常有用的是这些提交显示在当前树的上下文中,因此您可以单击各个提交并查看其包含的文件更改,单击文件以查看正常情况下的差异。比在命令行上容易得多。

     

找到丢失的提交后,要么手动将文本复制到编辑器,要么通过右键单击并选择“Cherry-Pick ...”将所有更改提交到当前分支。然后照常提交(并且稍微跳舞,因为你刚刚保存了几天的工作)。

发现,内容已恢复。