Git Switch分支,丢失了未跟踪的文件

时间:2019-02-14 01:06:46

标签: git

我一直在从事一个主要使用master分支的项目,但是我做过的一个dev分支并没有做很多事情。我切换到该分支并切换回Master,却发现我所有未跟踪的文件都不再位于我的存储库中(.env文件,数据文件夹以及其中的所有内容,config.json文件)。

似乎当我切换分支时,我的存储库已更改并丢弃了.gitignore中的所有内容。有什么方法可以恢复所有这些文件?

1 个答案:

答案 0 :(得分:3)

  

我切换到该[dev]分支,然后又切换回master ...

master的尖端提交中,在.gitignore中未跟踪并在dev中列出的那些文件很有可能存在

正在做

git checkout dev

告诉您的Git:dev所指向的提交中的内容替换我的索引和工作树内容。因此,您的Git查找所有冻结到该特定提交中的文件。 ,从提交中提取它们,将它们放入您的索引中,然后将它们反Git化(解冻并解压缩)到您的工作树中。

这自然会覆盖工作树中的未跟踪文件。但这没什么大不了,对吧?他们正在提交。

然后,您告诉Git:master所指向的提交中的内容替换我的索引和工作树内容。因此,您的Git会找到冻结在提交中的所有文件。在master的顶端,将它们提取出来,然后像以前一样将它们放入索引和工作树中。这次,这些文件没有在提交中。但是它们被跟踪并匹配提交的副本,因此Git 删除

现在他们不见了!

您可以使用dev使它们脱离git show的提交,而无需跟踪它们:

git show dev:file > file

这将提取dev所标识的提交处的内容,并将输出生成到stdout,然后将其重定向到文件。这里不幸的是,它使您冻结到该提交中的任何内容,不一定与您运行{{1}时在工作树中的 匹配。 }。

经常,Git会在其中一个步骤中就此警告您。如果您注意这些警告并将文件移开,则表示已移走了副本。但是在某些情况下,在git checkout dev中列出文件会产生副作用,即赋予Git 破坏其内容的权限。因此,在一些极端的情况下,Git会擦除当前内容,假设由于文件是.gitignore d,因此它们无论如何都不是宝贵的。

恢复此类文件的唯一方法是在Git外部,例如使用Mac上的Time Machine或系统备份。