我一直在从事一个主要使用master分支的项目,但是我做过的一个dev分支并没有做很多事情。我切换到该分支并切换回Master,却发现我所有未跟踪的文件都不再位于我的存储库中(.env文件,数据文件夹以及其中的所有内容,config.json文件)。
似乎当我切换分支时,我的存储库已更改并丢弃了.gitignore中的所有内容。有什么方法可以恢复所有这些文件?
答案 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或系统备份。