我遇到了 "切换分支会覆盖以下未在追踪中的工作区文件...请在切换分支之前移动或删除它们" 的错误。
常见解决方法似乎是使用 git clean
命令。
我输入该命令时没有出现任何错误,但也没有发生任何事情。当我尝试切换到另一个分支时,我仍然会收到上面提到的相同错误。
请问为什么 git clean
会完全没有反应呢?
更新:
更多信息:使用 git -n
和 git -f
命令结果完全相同,都没有任何反应。
如果您想清除未跟踪的文件,请使用下面的命令。但是,在运行此命令之前,请注意,它将擦除您的工作区、索引和 HEAD。
git reset --hard
我认为您的工作区存在未被跟踪的目录或在gitignore中被忽略的文件(构建文件)。您可以通过以下命令将其删除。
git clean -dfx
-d
除了未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会将其删除。如果确实要删除此类目录,请使用-f选项两次。
-f --force
如果Git配置变量clean.requireForce未设置为false,则git clean将拒绝删除文件或目录,除非给出-f、-n或-i。除非给出第二个-f,否则Git将拒绝删除具有.git子目录或文件的目录。
-x
不使用从.gitignore(每个目录)和$GIT_DIR/info/exclude读取的标准忽略规则,但仍然使用使用-e选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以与git reset一起使用(可能)来创建一个原始的工作目录,以测试一个干净的构建版本。
更多信息请参见git clean
像其他评论指出的那样,您确实需要添加 -f 标志。
但是您可能遇到问题不是因为没有指定 --force,而是因为您在不同的子目录中。
例如,如果我有一个存储在 /myrepo/.git 中的git仓库
并且未跟踪的文件在子目录 /myrepo/untracked/file.txt 中,
但我的终端当前工作目录是 /myrepo/src/。
git clean -fd 将无法工作。您需要在运行命令之前 cd 到项目根目录。
简而言之:git clean -fd 显然只会清理您终端当前工作目录下以及其以下的未跟踪文件和目录。
这可能不是OP遇到的情况。但我也遇到了同样的问题。在我的情况下,没有被清理的目录是我添加的子模块,但后来我对其进行了git重置。我必须从.gitmodules
、.git/config
和.git/modules/子模块路径
中删除所有痕迹,即使git status识别它为未跟踪,git clean才能将其删除。
git mv
移动了一些子模块。我在 .gitmodules
或 .git
中找不到任何看起来应该被删除的内容,所以我只能手动删除那些目录。非常烦人。 - Maxgit clean -fd
git stash
如果您想回滚所有更改,请使用以下方法:
git stash apply
我经常使用git clean -df -f
或git clean -dfx -f
(如果我想要删除被忽略的文件),因为这是Git官方文档中所说的:
-f
--force
If the Git configuration variable clean.requireForce is not set to
false, git clean will refuse to delete files or directories unless
given -f or -i. Git will refuse to modify untracked nested git
repositories (directories with a .git subdirectory) unless a second -
f is given.
我觉得您需要指定-n或-f。从man手册中可以看到:
OPTIONS
-f, --force
If the Git configuration variable clean.requireForce is not set to false, git clean will refuse to delete files or
directories unless given -f, -n or -i. Git will refuse to delete directories with .git sub directory or file unless a second
-f is given.
-f
和 -n
也没有产生任何作用。 - DA.git clear -f
不会递归到未跟踪的目录中,即使文档中写道:
从当前目录开始,通过递归删除未受版本控制的文件来清理工作树。
...
-d
文档澄清了混淆:
通常情况下,如果没有指定<path>,git clean将不会递归到未跟踪的目录中,以避免删除过多。指定-d将使其递归到这些目录中。
...
If the Git configuration variable clean.requireForce is not set to false, git clean will refuse to delete files or directories unless given -f, -n or -i
- William Pursell-f
和-n
也没有任何作用。 - DA.git status
显示了什么? - Spacemoosegit clean
的目录是哪个?它只会清理当前工作目录及其子目录。 - William Pursellgit checkout ... -f
) 成功检出了 -- 但仍然好奇为什么 git clean 没有起作用。 - DA.