从Git中删除的存储中恢复被忽略的目录

时间:2012-01-14 19:53:36

标签: git

我丢失了一个被忽略的(在.gitignore中列出)目录,它隐藏了未跟踪的文件,然后拙劣地弹出了。

我在一次提交中集中了大量的更改(大部分代码移入新文件,重新排序代码,单行更改等)。我想把它们分成几个单独的提交。首先,我创建了一个新的分支并检查出来,以确保安全。我重置为上一次提交并使用git add --patch来完成所有更改,并选择性地索引我想要包含在第一次新提交中的那些更改。我还想要包含我创建的几个新文件,所以我也必须添加它们。一旦我的索引反映了我想要的第一个新提交的更改,我使用git stash save --keep-index --include-untracked来存储未编制索引的更改,并仅在工作目录中保留索引更改,因此我可以在提交之前测试它们。一旦我对提交感到满意,我就会提交它,从存储中弹出更改,然后有选择地为下一个新提交添加更改。

现在,我搞砸了几次。首先,我忘记了藏匿中的--include-untracked,所以我的工作目录仍然拥有我不想要的所有新文件。我立刻意识到并试图git stash pop所以我可以再试一次,但是我遇到了合并冲突。我不确定如何正确合并,所有选择性添加的更改,所以我回到主人,创建了一个新的分支,并检查出来,希望我在第一个新分支搞砸了什么会留在那里(我多么错误......)。

下次(选择性地再次添加后,phew ..),我忘了添加我想要包含在提交中的新文件,所以它们被隐藏了。我再次切换回主人,做了一个新的分支,并再次尝试。

在“正确”之前,我必须至少做过3到4次。但是当我去测试我的代码时,它找不到我正在使用的输入文件之一。该文件位于我的“ignore”目录中,该目录在.gitignore中列出。当我查看时,缺少整个目录。我在那里扔了很多东西 - 数据库文件等 - 我想保留它们,但不跟踪它们的变化。

所以我查看了我的git stash list。它列出了大约5个stashes,其中4个我刚刚创建的如上所述。我意识到他们没有在各自的分支机构中保持良好状态。然后我尝试在存储器中找到我的“忽略”目录。我试图弹出每一个,但一直遇到合并冲突,我从来没有真正确定如何解决它们 - 当我以为我有,存储仍然存在于列表中但似乎已部分应用。我最终尝试弹出,然后将每个存储丢弃在列表中,始终注意我丢失的目录以显示。它没有。

我按照How to recover a dropped stash in Git?的说明查看我在gitk中的历史记录,但似乎找不到我丢失的目录;列出的提交都没有在树或补丁视图中,这可能是有意义的,因为 应该忽略它。我特别关注那些标有WIP的,但没有骰子。

我也试过检查我所做的每个分支,但没有用。

如何跟踪它?它不在任何地方(非存储)提交,​​因为它从未被跟踪过。我假设它被一个藏匿处删除了,但也许我错了。我如何找到我丢弃的藏匿物并选择正确的藏匿物 - 我可以按内容搜索吗?当我找到它时,如何强制它应用而不会发生冲突?

尝试更新

$ git reflog --all
25b96f2 refs/heads/recover0@{0}: commit: trash
fbf987b refs/heads/recover0@{1}: commit: trash
de24fd2 refs/heads/tmp2@{0}: branch: Created from de24fd
78f64c9 refs/heads/fix0dot1@{0}: commit: temp commit d
6aaa987 refs/heads/tmp0@{0}: branch: Created from 6aaa987
6cab748 refs/heads/exp6@{0}: commit: trash
7cab1c1 refs/heads/tmp4@{0}: branch: Created from 7cab1c
bc60313 refs/heads/tmpA0@{0}: branch: Created from bc6031
38389f3 refs/heads/a1a@{0}: branch: Created from master
f01ca25 refs/heads/tmp5@{0}: branch: Created from f01ca2
0d59a2d refs/heads/tmp6@{0}: branch: Created from 0d59a2
43a9dc8 refs/heads/tmp7@{0}: branch: Created from 43a9dc
e8dd137 refs/heads/exp5@{0}: branch: Created from master
207bfea refs/heads/exp3@{0}: commit (amend): temp commit c
996a20b refs/heads/exp3@{1}: commit (amend): temp commit c
a1713f8 refs/heads/exp@{0}: rebase -i (finish): refs/heads/exp onto 7d5e666
09d03de refs/heads/exp@{1}: branch: Created from master
7d5e666 refs/heads/exp4@{0}: reset: moving to HEAD^
149c949 refs/heads/exp4@{1}: commit (amend): temp commit a
b4d9cbc refs/heads/exp4@{2}: rebase -i (finish): refs/heads/exp4 onto 75f8808
e8dd137 refs/heads/exp4@{3}: branch: Created from master
ec8afef refs/heads/exp6@{1}: reset: moving to HEAD^
7d5e666 refs/heads/exp6@{2}: reset: moving to HEAD^
38389f3 refs/heads/exp6@{3}: branch: Created from master
7e66c30 refs/stash@{0}: WIP on master: 662f5b9 fix #6: Print time used
f2e045e refs/heads/tmp8@{0}: branch: Created from f2e045
b780d56 refs/heads/tmp3@{0}: branch: Created from b780d5

1 个答案:

答案 0 :(得分:2)

git reflog --all应包括丢弃的藏匿处。您可以看到它的名称(它们类似于stash@{N}),然后使用git show或reset或其他任何东西来查看。

如果你无法从reflog中找到它,我认为你不能用git恢复它。

有一个原因是未跟踪文件被调用。我建议你确保提交你关心的任何文件/目录。这样你通常可以正确地恢复它们。