我一直在一个项目上工作,主要使用了一个主分支,但也有一个开发分支,我没有在上面做太多的工作。我切换到那个分支,然后又切回主分支,结果发现我的所有未追踪的文件都不再我的代码库中(.env文件、data文件夹及其内部所有内容、config.json文件)。
似乎当我切换分支时,我的代码库发生了变化,并且放弃了.gitignore中的所有内容。是否有办法恢复所有这些文件?
我一直在一个项目上工作,主要使用了一个主分支,但也有一个开发分支,我没有在上面做太多的工作。我切换到那个分支,然后又切回主分支,结果发现我的所有未追踪的文件都不再我的代码库中(.env文件、data文件夹及其内部所有内容、config.json文件)。
似乎当我切换分支时,我的代码库发生了变化,并且放弃了.gitignore中的所有内容。是否有办法恢复所有这些文件?
我切换到了 [
dev
] 分支,然后又切回了master
...
很有可能是,那些文件在 master
分支中未被跟踪,并且在 .gitignore
中列出,但它们存在于 dev
分支的 tip commit 中。
执行以下操作:
git checkout dev
dev
指向的提交替换我的索引和工作树内容。因此,你的Git会找到所有被冻结在特定提交中的文件,从该提交中提取它们,将它们放入你的索引中,并将它们解压缩并还原为非Git状态的工作树。master
指向的提交替换我的索引和工作树内容。因此,你的Git会找到位于master
末尾提交的冻结文件,提取它们,并像之前一样将它们放入你的索引和工作树中。这次,那些文件不在提交中。但它们被跟踪,并与提交的副本匹配,所以Git 删除它们。git show
从dev
末尾的提交中获取它们,而不使它们成为已跟踪的文件。git show dev:file > file
dev
标识的提交中的任何内容,并将输出重定向到stdout,然后再将其重定向到文件。不幸的是,它会获取您在最初运行git checkout dev
时所在工作树中的内容,这并不一定与该提交中的内容相匹配。.gitignore
中列出文件会产生副作用,即在某些情况下,Git会有权覆盖它们的内容。因此,在某些边缘情况下,Git会清除当前内容,因为这些文件被列在.gitignore
中,说明它们没有任何价值。venv
文件夹。 venv
位于new_project /
文件夹中。 new_projects /
及其内容仅在dev
分支下创建和跟踪。切换到master
会使new_project
消失。似乎任何形式的dev
分支和master
合并也将消除我的未跟踪的venv
文件夹? - Joshua Zastrowvenv/*
文件放入索引的操作都会导致这些文件被跟踪,因为“已跟踪”的定义是“存在于索引中的文件”。随后删除名称为venv/*
的索引条目会导致这些文件也从工作树中删除。因此,如果您想知道:操作X是否会触及我的venv/*
文件? 您可以将该问题转化为:操作X是否将venv/*
文件放入索引中? - torekgit merge
命令,以及执行合并操作的任何操作,如git revert
或git cherry-pick
,都是在索引中进行操作,并确实将文件(来自作为合并三个输入的三个提交的所有文件)放入索引。这是最复杂的情况,因为它使用每个文件的较高的暂存槽(槽1-3),但通用规则将使您保持安全:如果这将触及索引中的venv/*
文件,请先将现有的未跟踪的venv/*
文件移到旁边。 - torekmv venv venv.save
。进行Git操作,完成后清理并确保 venv / *
不再相关或不存在,然后根据需要删除目录,然后 mv venv.save venv
。 - torekgit stash list
从stash列表中选择stash@{number}。以5为例,查看从该点开始的内容(您的未跟踪文件可能存储在不同的数字中)。
git stash show --include-untracked stash@{5}
当你看到丢失的文件后,你可以使用“git apply”进行恢复,它类似于“git pop”,但不会从存储列表中移除状态。确保首先提交任何新更改并备份所有文件!
git stash apply stash@{5}
如果你遇到了合并错误,只需提交这些文件,然后再尝试最后一步。
然后,你的文件就回来了!