Git切换分支后,未跟踪的文件丢失了。

5

我一直在一个项目上工作,主要使用了一个主分支,但也有一个开发分支,我没有在上面做太多的工作。我切换到那个分支,然后又切回主分支,结果发现我的所有未追踪的文件都不再我的代码库中(.env文件、data文件夹及其内部所有内容、config.json文件)。

似乎当我切换分支时,我的代码库发生了变化,并且放弃了.gitignore中的所有内容。是否有办法恢复所有这些文件?


当切换分支时,Git会保留在你的.gitignore中列出的所有文件,因此它们不应该受到影响。你确定它们不在那里吗? - Oscar W
如果您丢失了所有未跟踪的文件,除了切换分支之外,您可能还做了其他事情。 - infused
2个回答

5

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

很有可能是,那些文件在 master 分支中未被跟踪,并且在 .gitignore 中列出,但它们存在于 dev 分支的 tip commit 中。

执行以下操作:

git checkout dev

告诉你的Git:dev指向的提交替换我的索引和工作树内容。因此,你的Git会找到所有被冻结在特定提交中的文件,从该提交中提取它们,将它们放入你的索引中,并将它们解压缩并还原为非Git状态的工作树。
这自然会覆盖工作树中的未跟踪文件。但这没什么大不了的,对吧?它们在提交中。
然后你告诉Git:master指向的提交替换我的索引和工作树内容。因此,你的Git会找到位于master末尾提交的冻结文件,提取它们,并像之前一样将它们放入你的索引和工作树中。这次,那些文件不在提交中。但它们被跟踪,并与提交的副本匹配,所以Git 删除它们。
现在它们被删除了!
你可以使用git showdev末尾的提交中获取它们,而不使它们成为已跟踪的文件。
git show dev:file > file

这将提取由dev标识的提交中的任何内容,并将输出重定向到stdout,然后再将其重定向到文件。不幸的是,它会获取您在最初运行git checkout dev时所在工作树中的内容,这并不一定与该提交中的内容相匹配。
通常,Git会在其中一个步骤中警告您。如果您注意这些警告并将文件移到其他地方,那么您就有了备份的副本。但是,在.gitignore中列出文件会产生副作用,即在某些情况下,Git会有权覆盖它们的内容。因此,在某些边缘情况下,Git会清除当前内容,因为这些文件被列在.gitignore中,说明它们没有任何价值。
恢复这样的文件的唯一方法是在Git之外使用例如Mac上的Time Machine或系统备份。

因此,特别是我有一个在.gitignore中的virtualenv venv文件夹。 venv位于new_project /文件夹中。 new_projects /及其内容仅在dev分支下创建和跟踪。切换到master会使new_project消失。似乎任何形式的dev分支和master合并也将消除我的未跟踪的venv文件夹? - Joshua Zastrow
1
任何强制Git将venv/*文件放入索引的操作都会导致这些文件被跟踪,因为“已跟踪”的定义是“存在于索引中的文件”。随后删除名称为venv/*的索引条目会导致这些文件也从工作树中删除。因此,如果您想知道:操作X是否会触及我的venv/*文件? 您可以将该问题转化为:操作X是否将venv/*文件放入索引中? - torek
1
git merge命令,以及执行合并操作的任何操作,如git revertgit cherry-pick,都是在索引中进行操作,并确实将文件(来自作为合并三个输入的三个提交的所有文件)放入索引。这是最复杂的情况,因为它使用每个文件的较高的暂存槽(槽1-3),但通用规则将使您保持安全:如果这将触及索引中的venv/*文件,请先将现有的未跟踪的venv/*文件移到旁边。 - torek
1
请注意,如果它们都在一个子目录中,像这样移动就很容易:mv venv venv.save。进行Git操作,完成后清理并确保 venv / * 不再相关或不存在,然后根据需要删除目录,然后 mv venv.save venv - torek
另一个Git的晦涩用户体验导致问题的案例,这次是相当严重的情况。 - Josh Noe

1
我曾经遇到过这种情况,并从使用“git stash”的人那里发现了一个非常好用的解决方案。请参考https://git-scm.com/docs/git-stash。您可以尝试以下操作:
git stash list

从stash列表中选择stash@{number}。以5为例,查看从该点开始的内容(您的未跟踪文件可能存储在不同的数字中)。

git stash show --include-untracked stash@{5}

当你看到丢失的文件后,你可以使用“git apply”进行恢复,它类似于“git pop”,但不会从存储列表中移除状态。确保首先提交任何新更改并备份所有文件!

git stash apply stash@{5}

如果你遇到了合并错误,只需提交这些文件,然后再尝试最后一步。

然后,你的文件就回来了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接