如何从当前的Git工作树中删除本地(未跟踪)文件?

8044

我该如何从当前的工作树中删除未被跟踪的本地文件?


102
这个互动的 git 命令速查表 http://www.ndpsoftware.com/git-cheatsheet.html 展示了 git 工作区(使用 "workspace" 而非 "working copy" 可以获得更好的谷歌搜索结果)。 - qneill
36
注意:如果您只想删除部分未跟踪的文件,而不是全部git clean现在有一个交互模式!请参见我对另一个问题的答案:git 1.8.4+ - VonC
在发布新答案之前,请考虑该问题已经有25个以上的答案。确保你的答案提供了现有答案中没有的信息。 - Sazzad Hissain Khan
8
为了让初学者和新手更好理解 Git,可以运行 git status 命令,如果它显示有一个文件未被跟踪,并且你不想将该文件添加到版本库中,你可以直接在文件系统中删除或移动它。这样不会对你的本地仓库或 Git 造成任何损害。你也可以使用 git clean 或以下答案中的某些变体,包括交互式版本,以仅删除选择的文件,但交互模式可能很繁琐。无论你做什么,一定要确保你理解 git clean 将删除哪些内容,或使用 --dry-run 让它告诉你而不会真正执行删除操作。 - LightCC
6
如果这些文件尚未被跟踪,你是否可以在不使用git的情况下删除它们呢?rm files-to-be-deleted - mhatch
Git现在提供交互模式,可以有选择性地删除特定的未跟踪文件,允许您选择要删除哪些文件,同时保留其他文件不受影响。 - Dmitrii Malygin
41个回答

102

如果需要从特定的子目录中删除未跟踪的文件,

git clean -f {dir_path}

结合的方式删除未跟踪的目录/文件和忽略的文件。

git clean -fxd {dir_path}

在此之后,您将只会在 git status 中看到修改过的文件。


95

删除此存储库及其子模块中的所有额外文件夹和文件

这将使您处于与全新克隆相同的状态。

git clean -ffdx

删除此存储库中所有额外的文件夹和文件,但不包括其子模块。

git clean -fdx

删除额外的文件夹,但不包括文件(例如构建或日志文件夹)

git clean -fd

删除多余的文件夹和被忽略的文件(但不包括新增加的文件)

如果文件没有被忽略且还未被检入,则保留。请注意大写字母X。

git clean -fdX

新的交互模式

git clean

1
这个答案非常好!在提交操作之前,您可以始终添加“--dry-run”选项来列出要删除的文件/文件夹。 - Honghao Z

70

好的,在命令行中使用git删除不需要跟踪的文件和文件夹很容易,只需按照以下步骤操作:

git clean -fd

在执行操作前请仔细检查,因为它将删除文件和文件夹而不留下任何历史记录...

在这种情况下,-f 表示强制,-d 表示目录...

因此,如果您只想删除文件,您可以仅使用 -f

git clean -f

如果您想要删除(目录)和文件,您可以像这样仅删除未被跟踪的目录和文件:

git clean -fd

此外,您可以使用-x标志来包含被Git忽略的文件。如果您希望删除所有内容,这将非常有帮助。

添加-i标志会使git在进行文件删除时逐个询问您是否允许。

如果您不确定并希望先检查,请添加-n标志。

如果您不想在成功删除后看到任何报告,请使用-q

我还创建了下面的图片,以使其更加易于记忆,特别是我发现许多人有时会混淆-f用于清理文件夹或以某种方式混淆它们!


deleting unwanted untracked files and folder


68

git clean -fd 删除目录

git clean -fX 删除已被忽略的文件

git clean -fx 删除已被忽略和未被忽略的文件

可以将以上选项组合使用,如:

git clean -fdXx

更多帮助信息请查阅git手册。


11
命令git clean -fdXx会在使用git-2.8时出现错误信息“fatal: -x and -X cannot be used together”。请参考Git手册中的相关内容。链接如下:https://git-scm.com/docs/git-clean - oHo

43

更好的方法是使用:git clean

git clean -d -x -f

这将删除未被跟踪的文件, 包括目录 (-d) 和被Git忽略的文件 (-x)

另外,将-f选项替换为-n以执行dry-run 或使用-i进行交互模式,它将告诉您将要删除的内容。


31

用户交互式方法:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/arsdumpgenerator/s3/ [y/N]? y

-i 用于交互式操作
-f 用于强制操作
-d 用于目录操作
-x 用于忽略文件(根据需要添加)

注意:添加 -n--dry-run 以仅检查它将执行的操作。


26

移除未追踪的文件:

git add .
git reset --hard HEAD

25

我刚刚想出并尝试了一个在这种情况下非常有效的生活技巧:

git add .
git reset --hard HEAD

注意! 在执行此操作之前,请务必提交任何必要的更改(即使是在未跟踪的文件中)。


3
至少这是一种不同的方法。 :) 另一种方式是,在 reflog 中记住已删除的文件但不在任何分支中,方法如下:git add . git commit -m 'about to delete' git reset --hard HEAD~ - joeytwiddle
2
更快的方法是 git add . && git reset --hard HEAD - thybzi
3
将所有修改加入暂存区,并强制覆盖本地工作目录的修改。 - Pleymor
@AlexanderMills git reset --hard 会将所有未提交但未被跟踪的文件重置为最新提交的状态。这就是为什么我们首先需要 git add . - 这会将所有未被跟踪的文件添加到暂存区(以便它们也能被重置)。 - thybzi

23

只有以下方法对我起作用:

git clean -ffdx
在所有其他情况下,我会收到一些子目录的消息“跳过目录”

2
谢谢。我省略了 -x,只使用了 git clean -ffd 来避免删除 .gitignore 中的文件。 - Feckmore

22

git clean -f -d -x $(git rev-parse --show-cdup) 将清除整个仓库目录,无论你在哪个目录树中调用它。我经常使用它,因为它不强制你离开当前工作目录,并允许你在当前位置进行清理和提交。

请确保标志 -f-d-x 符合您的需求:

-d
       Remove untracked directories in addition to untracked files. If an
       untracked directory is managed by a different Git repository, it is
       not removed by default. Use -f option twice if you really want to
       remove such a directory.

-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. This affects
       also git submodules where the storage area of the removed submodule
       under .git/modules/ is not removed until -f is given twice.

-x
       Don't use the standard ignore rules read from .gitignore (per
       directory) and $GIT_DIR/info/exclude, but do still use the ignore
       rules given with -e options. This allows removing all untracked
       files, including build products. This can be used (possibly in
       conjunction with git reset) to create a pristine working directory
       to test a clean build.

还有其他可用的标志,请查看git clean --help


顺便提一下,你可以直接运行 git clean {flags} :/ 命令,这样就好像你在存储库根目录下运行了该命令。 - The-null-Pointer-

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