在 Git 中删除文件并不总是看起来那么简单。您从系统中删掉了一个文件,但这并不意味着它已经从仓库中消失。它可能仍然存在于历史记录中,更糟的是,可能会被不小心提交,比如配置文件或 API 密钥。
在本指南中,您将学习如何从 Git 中删除文件。我们将从 git rm 等基础命令开始,然后介绍更高级的方法,如清理未跟踪文件和编辑提交历史。
先决条件 在使用 Git 删除文件之前,先确保一切准备就绪。
首先检查是否已安装 Git。打开终端并运行:
git --version技术支持 如果您看到版本号,就可以继续了。
如果您看到版本号,就可以继续了。
如果您更喜欢可视化界面,也可以安装 Git GUI 工具,如 GitHub Desktop、Sourcetree 或 GitKraken。但在本指南中,我将使用命令行(Git Bash)。
请确保您有权在仓库中进行更改,尤其是在团队中或使用 GitHub、GitLab 等远程仓库时。
注意 :某些删除操作无法撤销。因此,建议在运行任何删除文件的命令之前备份项目,或至少仔细检查仓库的当前状态。
准备就绪后,我们开始吧。
Git 中的基础文件删除 在 Git 中删除文件有几种方式,取决于您的目标。下面来看一些常见选项:
使用 git rm git rm 命令会从 Git 仓库中删除文件。运行后会发生两件事:
Git 会将该文件从工作目录中移除 并将该更改加入暂存区,等待下次提交 但 Git 不仅仅是删除文件。它还会在历史记录中追踪这次删除。一旦您提交,该文件就会正式从项目中移除。
git rm file1.txt技术支持
您可以删除一个文件、多个文件,或使用通配符删除一组文件。
例如,删除所有日志文件:
git rm *.log技术支持 这会告诉 Git 删除该文件夹中所有以 .log 结尾的文件。您可以使用以下命令确认更改:
git status技术支持
使用一次 git rm 命令删除多个文件。图片由作者提供。
想删除某个文件夹内的所有文件,但保留文件夹本身?使用:
git rm temp/*技术支持 这会删除 temp 文件夹中的所有文件,但不会删除该文件夹本身。
Git 也提供了一些安全检查。如果文件有未提交的更改,除非您强制删除,否则 Git 不会删除它。所以只有在确认这些更改可以丢弃时才使用:
git rm -f技术支持
要删除整个文件夹及其中所有内容,添加 -r 标志:
git rm -r testfolder技术支持 这会删除 testfolder 及其中的所有文件。
现在,提交这些更改,运行以下命令:
git commit -m "removed log files”技术支持
常用 git rm 选项 以下是您在使用 git rm 时最常用的选项:
1. <filename> 这是最基础的用法。直接列出您想删除的文件:
git rm file1.txt file2.txt技术支持 您也可以使用通配符删除同一类型的多个文件。例如,删除所有 .txt 文件:
git rm *.txt技术支持 (这里 * 表示“所有”,匹配任意以 .txt 结尾的文件名。)
2. --cached 这会从仓库中移除文件,但保留在您的电脑上。比如我不小心添加了一个敏感文件 config.env。我不想把它放进仓库,但本机仍然需要,所以我会运行:
git rm --cached config.env技术支持 此处,git rm 会从仓库和工作区删除。加上 --cached 则是让 Git 停止跟踪它(因此不会被推送),但在物理上保留文件。
为了防止它再次被添加,把它加入 .gitignore :
echo config.env >> .gitignore技术支持
3. -r 表示递归。与其删除单个文件,它会递归删除目录及其内容。如果不加该选项,尝试删除文件夹时 Git 会报错。
git rm -r <folder-name>技术支持 这里,我创建了一个名为 testfolder 的文件夹,里面有两个文件:a.txt 和 b.txt. 接着,我运行如下命令:
git rm -r testfolder技术支持 这样就删除了该文件夹以及其中的所有内容和文件。
4. --dry-run 如果您不确定删除某个文件会发生什么,可以将 git rm 与 --dry-run 选项一起使用:
git rm --dry-run <filename>技术支持 这是一种安全的方式来预览将被删除的内容。
或者,如果您在清理未跟踪的文件并想再次确认会删除什么,请使用:
git clean -n技术支持 这只会显示该命令会删除的内容。
工作流对比分析 在 Git 中删除文件不止一种方式。方法看起来类似,但行为并不相同。
git rm 与手动删除 以一个名为 file.txt 的文件为例。假设我不再需要它。
一种方法是在系统中直接删除它。
在 Linux、macOS 或 Git Bash 上:
rm file.txt技术支持 在 Windows(命令提示符)上:
del file.txt技术支持
这会从文件夹中删除该文件。但 Git 还不知道这件事。因此您需要手动告诉 Git 文件已被删除:
git add file.txt技术支持 这会将“删除”动作放入暂存区,从而在下次提交中包含该删除。
如果您删除了多个文件且不记得都有哪些,可以运行:
git add -u技术支持 这会将所有被跟踪文件的修改或删除加入暂存区。它不会包含未跟踪文件。
然后提交更改:
git commit -m "Remove file.txt"技术支持 如果使用 git rm,则一步到位。它会删除文件并立刻将更改加入暂存区:
git rm file.txtgit commit -m "Remove file.txt"技术支持 无需单独运行 git add。更简洁,也不容易忘记暂存删除操作。
简而言之:
手动删除需要额外步骤来确保 Git 捕捉到更改。 如果您忘了暂存删除,Git 仍认为文件存在,这会在提交或合并时引发混淆。 当您有意删除被跟踪文件时,git rm 更简洁且更安全。 在 Git 中还原被删除的文件 如果您删除了一个文件,后来发现还需要它怎么办?别担心。Git 提供了几种恢复方式,取决于您何时发现错误。
如果您还未提交:
假设您已经删除了文件,但尚未提交。您可以这样从上一次提交中恢复它:
git restore file.txt技术支持 这会把文件从最新提交恢复到工作目录中。
如果您已经提交了删除:
也没问题。首先,找到该文件仍然存在的最后一次提交:
git log -- file.txt技术支持 在日志中查找并复制该文件仍存在时的提交哈希。然后运行:
git checkout <commit hash> -- file.txt技术支持 在旧版本的 Git 中您可以使用上述命令。该命令会从特定提交中恢复文件,但也可能会切换分支。
从 Git 2.23 开始,这被拆分为两个更清晰的命令:
git switch(用于切换分支)git restore(用于恢复文件)如果您只想从某次提交中恢复某个文件,请使用:
git restore --source=<commit-hash> --file.txt技术支持 这会从该提交中取出文件并放回您的工作目录。
如果您不确定文件何时被删除:
也许您做了很多修改,已不记得到底何时丢了该文件。在这种情况下,使用 git reflog(引用日志) :
git reflog技术支持 这会显示您的 Git 提交、签出、重置等操作的完整历史。
但 git reflog 仅在本地有效,无法用于远端。如果您与远程仓库协作,用 git log -- file.txt 来追踪该文件的历史会更好。
一旦找到文件仍存在的时间点,像之前一样使用 git checkout 或 git restore 来恢复它。
修复 Git 中的“缺失文件” 有时文件会被直接从系统中删除——也许是通过文件管理器、终端 rm 命令,或纯属意外。这种情况下,Git 不会自动清理。它会把这些文件标记为缺失,等待您来正确处理删除。
下面按步骤看看如何应对这种情况。
步骤 1:检查缺失文件 在项目文件夹中运行:
git status技术支持
如果 Git 显示某个文件已删除,说明它已从系统中消失,但该更改尚未被暂存。
步骤 2:暂存删除 要告诉 Git 暂存所有更改(包括已删除文件),运行:
git add -A技术支持 git add -A = 暂存所有更改(新增、修改、删除)。 git add -u = 暂存修改 + 删除,但不包含新增文件。 这会将所有文件更改(新增、修改、删除)加入暂存区。然后提交更新:
git commit -m "Removed missing files"技术支持
这是最安全的清理方式,因为它能一次性捕捉到所有更改。
步骤 3:推送到远程 如果您在使用远程仓库,推送该提交:
git push origin <branch-name>技术支持 将 <branch-name> 替换为工作分支,如 main 或 dev。
步骤 4:另一种方式 假设您手动删除了一堆文件,可能是误删,也可能是在清理时删的。Git 仍会认为这些文件存在,直到您另行告知。
如果不想对每个文件都用 git rm,可以用更快的方法来清理。
在终端运行:
git ls-files --deleted -z | xargs -0 git rm技术支持 它的作用是:
git ls-files --deleted 列出所有被 Git 跟踪但现在已在磁盘上缺失的文件。xargs -0 git rm 将这些文件名传给 git rm,从 Git 索引中移除它们。当您在大型项目中想要快速清理时,这非常有用。
注意 :我收到此消息,是因为当前没有被跟踪但在磁盘上缺失的文件。
Git 的高级文件删除 现在我们已覆盖基础内容,来看一些删除文件并非“运行 git rm 就完事”的高级场景。这些情况要么涉及敏感数据,要么需要谨慎清理未跟踪文件。
从 Git 中移除敏感数据 有时包含私密数据的文件(如 API 密钥或密码)会被意外提交。单纯删除并无帮助。因为 Git 保留完整历史,该文件仍存在于早期提交中。
要彻底抹除它,您可以使用 git filter-repo 命令:git filter-repo(推荐)
这是 filter-branch 的更新、更好的替代方案。它更快、更安全,也更易用。
首先安装它(需要 Python 和 pip):
pip install git-filter-repo技术支持 然后运行:
git filter-repo --path hide.txt --invert-paths技术支持 这会从您仓库的每一次提交中移除 hide.txt 文件。
要确认,运行:
git log --all -- supersecrets.txt技术支持 如果文件确实消失了,把它加入 .gitignore,避免再次被跟踪:
echo hide.txt >> .gitignore技术支持 如果您在团队中协作,清理并重写历史后需要强制推送变更:
git push origin --force --all技术支持 然后通知您的队友。他们需要重新克隆或重置各自的本地副本,以避免错误。
使用 git clean 清理未跟踪文件 逐条说明:
被跟踪的文件存在于 Git 历史中。删除它们请使用 git rm,然后提交。 未跟踪的文件没有进入 Git。这些文件会逐渐堆积,让项目变得杂乱。 要删除未跟踪的文件或文件夹,请使用 git clean 。
以下是最实用的选项:
git clean -n # Show which untracked files will be removedgit clean -nd # Show which untracked folders will be removedgit clean -fd # Delete all untracked files and folders. It is destructive.技术支持
含义如下:
-n 表示仅预览。-f 表示强制删除。-d 表示在清理中包含文件夹。注意:git clean 不会碰被跟踪的文件。但它会删除所有未跟踪的内容,哪怕是您本想保留的。因此,务必先用 -n 预览将要删除的内容。
在 GitHub 与 GUI 工具中删除文件 以上我们主要使用命令行。但并非所有人都这样工作,这完全没问题。一些开发者在 GitHub 中直接使用可视化工具。
接下来看看在 GitHub 网页界面和其他 GUI 工具中如何删除文件,并比较它们与命令行的差异。
在 GitHub 网站中删除文件 如果您在 GitHub 的浏览器界面中工作,可以无需终端就删除文件。
以下是在 2025 界面中的操作方式:
打开您要删除的文件。 点击右上角的三个点。 在下拉菜单中选择 Delete file。
随后 GitHub 会显示一个提交信息框。添加简短信息,例如:
Delete practice.py技术支持 您也可以写一个可选的描述。
接着选择如何保存更改:
直接提交到 main 分支 或创建新分支并发起拉取请求(推荐用于团队协作) 点击 Commit changes,GitHub 会删除该文件,并将此删除作为一次提交保存,就像在命令行中使用 git rm 一样。
使用 Git GUI 工具删除文件 如果您使用 Git GUI 工具,如 GitHub Desktop、Sourcetree 或 Tower,流程也很简单:
在文件管理器或应用内删除文件。 应用会在“Changes”或“File Status”中显示该删除。 检查、暂存并提交更改。 各工具界面略有不同,但工作流相似:您以可视化方式跟踪更改,准备好后再提交。
按平台的最佳实践 下面简要看下不同平台中的文件删除工作原理,以及各自适用场景:
GitHub(网页) :适合快速修复和小更新。避免用于大规模清理或敏感文件。Git GUI 工具 :适合日常工作。便于可视化查看更改并安全提交。命令行 :最灵活、最强大。适合诸如批量编辑或历史重写等高级任务。Git 文件删除的最佳实践 在 Git 中删除文件看似简单,但一步走错就可能破坏代码。以下是我在共享或长期项目中确保删除操作安全可控的一些实用建议。
删除前务必确认 在删除文件前,花一分钟确认它的作用:
运行 git status 查看它是否已暂存或被修改。 使用 git log -- <filename> 查看其提交历史。 这个快速检查能帮我省去日后成小时的恢复工作。
使用原子提交 “原子提交”指的是每个逻辑更改对应一次提交。
例如,如果我在删除未使用的文件,我只提交这些删除,与代码编辑分开。
这样做的好处包括:
调试更容易。当提交小而聚焦时,git bisect 等工具效果更好。 提交历史干净清晰。 代码评审更高效。 在重写历史时谨慎协作 使用 git filter-repo 等工具重写历史会影响团队中的所有人。为避免混乱:
在重写共享分支前先沟通。 谨慎使用 git push --force,因为它会改写远端历史。 提醒队友在之后重新克隆或重置本地仓库。 在执行破坏性命令前使用 --dry-run 在运行会删除文件的命令前,务必先测试:
git clean -n技术支持 这会显示可能被删除的内容,而不会真正删除。我认为您总该这么做的原因是:
避免误删您实际想保留的文件。 相当于一张安全网,尤其是在大型项目中,一次失误可能清空日志或生成文件。 结合使用 git rm --cached 与 .gitignore 如果您不小心提交了不该放入仓库的内容(如配置文件或日志),分两步修复:
取消跟踪该文件:```git rm --cached <filename> git rm --cached <filename>技术支持 这会告诉 Git 停止跟踪该文件,但保留在您的电脑上。
将其加入 .gitignore: echo <filename> >> .gitignore技术支持 这样做的好处是:
将敏感或本地文件(如 .env、.log 或 node_modules)排除在仓库之外。 防止仓库历史变得杂乱。 以后对这些文件的修改不会再触发 Git 变化。 Git 边缘场景:暂存与空文件夹 有时删除文件并不会按预期进行。您可能会错误暂存了文件,或遇到空文件夹的问题。
下面是我常用的处理方法。
取消暂存而不丢失修改 假设我运行了 git add .,不小心把不该暂存的文件也暂存了。我不想丢失修改——只想把它从暂存区移除。
为此我运行:
git reset HEAD <filename>技术支持 这会取消暂存,但保留编辑内容。
要确认,使用:
git status技术支持 现在该文件应显示为“modified”而非“staged”。
在仓库中保留空文件夹 默认情况下,Git 会忽略空文件夹。如果我尝试提交一个空文件夹,Git 会跳过它。
但有时我希望在仓库中保留该文件夹,以便将来存放日志或上传文件。常见做法是添加一个占位文件 .gitkeep。
操作如下:
touch logs/.gitkeepgit add logs/.gitkeepgit commit -m "Keep logs folder in the repo"技术支持 这会让文件夹“非空”,从而被 Git 跟踪。
注意:.gitkeep 并非 Git 内置,只是一种约定。您可以任意命名该文件,但 .gitkeep 能向他人说明其用途。
Git 文件删除常见问题排查 下面是我在 Git 中删除文件时遇到的一些常见问题及其解决方法。
文件仍出现在远程仓库中 您删除了文件并提交了更改,但它仍在远程仓库中。可能是您忘记推送了。
请确保运行:
git push origin <branch-name>技术支持 还要检查:
您是否在正确的分支上? 您的提交是否确实包含了文件删除? 子模块相关问题 子模块是嵌在其他 Git 仓库中的 Git 仓库。它们的行为与普通文件夹不同。
如果您要删除子模块内的文件:
如果您要彻底移除子模块:
删除子模块文件夹 移除 .gitmodules 和 .git/config 中的相关引用 分离的 HEAD 状态 在 Git 中,HEAD 通常指向当前分支。但有时它会指向某个具体提交,这被称为“分离的 HEAD”。
可能发生在您:
按提交哈希签出某次提交 切换到某个标签 签出远程分支但未设置跟踪 检查当前状态:
git status技术支持 如果您看到:
HEAD detached at <commit-hash>技术支持 说明您不在任何分支上,切走后新更改可能会丢失。
修复方法如下:
如果您已经有更改并想保留,运行:
git checkout -b <new-branch-name>技术支持 这会把您的工作放到一个新分支上并保存。
如果您已经提交了更改,并想稍后把它们移到另一个分支,执行:
git checkout -b temp-branch # from detached HEADgit checkout main # or another target branchgit merge temp-branch技术支持 如果您没有做任何更改,只想退出分离的 HEAD,运行:
git checkout <branch-name> 技术支持 就是这样。您的 HEAD 已重新附着,一切恢复正常。
权限或状态错误 有时 Git 无法删除文件,尤其是在 Windows 上。通常是因为:
解决方法:
关闭任何使用该文件的应用 以管理员身份重启终端(Windows 上) 合并或变基问题 如果您看到如下错误:
you are not currently on a branch merge conflict 您很可能正处于合并或变基过程中。
在解决冲突后完成变基:
git rebase --continue技术支持 要完全取消变基或合并:
git reset --merge技术支持 这会将仓库恢复到开始合并之前的状态。
想丢弃所有本地更改并重置工作目录?
试试:
git restore .技术支持 这会把所有文件恢复到上次提交的状态。
结语 在 Git 中删除文件时,如果不留心,很容易出错。一个小失误就可能引发更严重的问题:代码损坏、工作丢失,或者团队协作混乱。因此,请花点时间再次确认您在做什么。
根据场景使用正确的命令。如果不确定某个操作的效果,先用 dry run 测试。如果您与他人协作,请确保大家达成一致。
除了删除文件,Git 还能做更多事。您可以删除分支 、用 reset 和 revert 撤销错误 ,或用 git diff 精确查看变更。 学得越多,工作流就越顺畅。
一步一步来,您就能掌握这些技巧。
在 Git 中删除文件并不总是看起来那么简单。您从系统中删掉了一个文件,但这并不意味着它已经从仓库中消失。它可能仍然存在于历史记录中,更糟的是,可能会被不小心提交,比如配置文件或 API 密钥。
在本指南中,您将学习如何从 Git 中删除文件。我们将从
git rm等基础命令开始,然后介绍更高级的方法,如清理未跟踪文件和编辑提交历史。先决条件
在使用 Git 删除文件之前,先确保一切准备就绪。
首先检查是否已安装 Git。打开终端并运行:
如果您看到版本号,就可以继续了。
如果您看到版本号,就可以继续了。
如果您更喜欢可视化界面,也可以安装 Git GUI 工具,如 GitHub Desktop、Sourcetree 或 GitKraken。但在本指南中,我将使用命令行(Git Bash)。
请确保您有权在仓库中进行更改,尤其是在团队中或使用 GitHub、GitLab 等远程仓库时。
注意:某些删除操作无法撤销。因此,建议在运行任何删除文件的命令之前备份项目,或至少仔细检查仓库的当前状态。
准备就绪后,我们开始吧。
Git 中的基础文件删除
在 Git 中删除文件有几种方式,取决于您的目标。下面来看一些常见选项:
使用 git rm
git rm命令会从 Git 仓库中删除文件。运行后会发生两件事:但 Git 不仅仅是删除文件。它还会在历史记录中追踪这次删除。一旦您提交,该文件就会正式从项目中移除。
您可以删除一个文件、多个文件,或使用通配符删除一组文件。
例如,删除所有日志文件:
这会告诉 Git 删除该文件夹中所有以
.log结尾的文件。您可以使用以下命令确认更改:使用一次 git rm 命令删除多个文件。图片由作者提供。
想删除某个文件夹内的所有文件,但保留文件夹本身?使用:
这会删除 temp 文件夹中的所有文件,但不会删除该文件夹本身。
Git 也提供了一些安全检查。如果文件有未提交的更改,除非您强制删除,否则 Git 不会删除它。所以只有在确认这些更改可以丢弃时才使用:
要删除整个文件夹及其中所有内容,添加
-r标志:这会删除
testfolder及其中的所有文件。现在,提交这些更改,运行以下命令:
常用 git rm 选项
以下是您在使用
git rm时最常用的选项:1. <filename>
这是最基础的用法。直接列出您想删除的文件:
您也可以使用通配符删除同一类型的多个文件。例如,删除所有
.txt文件:(这里
*表示“所有”,匹配任意以.txt结尾的文件名。)2. --cached
这会从仓库中移除文件,但保留在您的电脑上。比如我不小心添加了一个敏感文件 config.env。我不想把它放进仓库,但本机仍然需要,所以我会运行:
此处,
git rm会从仓库和工作区删除。加上--cached则是让 Git 停止跟踪它(因此不会被推送),但在物理上保留文件。为了防止它再次被添加,把它加入
.gitignore:3. -r
表示递归。与其删除单个文件,它会递归删除目录及其内容。如果不加该选项,尝试删除文件夹时 Git 会报错。
这里,我创建了一个名为
testfolder的文件夹,里面有两个文件:a.txt和b.txt.接着,我运行如下命令:这样就删除了该文件夹以及其中的所有内容和文件。
4.
--dry-run如果您不确定删除某个文件会发生什么,可以将
git rm与--dry-run选项一起使用:这是一种安全的方式来预览将被删除的内容。
或者,如果您在清理未跟踪的文件并想再次确认会删除什么,请使用:
这只会显示该命令会删除的内容。
工作流对比分析
在 Git 中删除文件不止一种方式。方法看起来类似,但行为并不相同。
git rm 与手动删除
以一个名为
file.txt的文件为例。假设我不再需要它。一种方法是在系统中直接删除它。
在 Linux、macOS 或 Git Bash 上:
在 Windows(命令提示符)上:
这会从文件夹中删除该文件。但 Git 还不知道这件事。因此您需要手动告诉 Git 文件已被删除:
这会将“删除”动作放入暂存区,从而在下次提交中包含该删除。
如果您删除了多个文件且不记得都有哪些,可以运行:
这会将所有被跟踪文件的修改或删除加入暂存区。它不会包含未跟踪文件。
然后提交更改:
如果使用
git rm,则一步到位。它会删除文件并立刻将更改加入暂存区:无需单独运行
git add。更简洁,也不容易忘记暂存删除操作。简而言之:
git rm更简洁且更安全。在 Git 中还原被删除的文件
如果您删除了一个文件,后来发现还需要它怎么办?别担心。Git 提供了几种恢复方式,取决于您何时发现错误。
如果您还未提交:
假设您已经删除了文件,但尚未提交。您可以这样从上一次提交中恢复它:
这会把文件从最新提交恢复到工作目录中。
如果您已经提交了删除:
也没问题。首先,找到该文件仍然存在的最后一次提交:
在日志中查找并复制该文件仍存在时的提交哈希。然后运行:
在旧版本的 Git 中您可以使用上述命令。该命令会从特定提交中恢复文件,但也可能会切换分支。从 Git 2.23 开始,这被拆分为两个更清晰的命令:
git switch(用于切换分支)git restore(用于恢复文件)如果您只想从某次提交中恢复某个文件,请使用:
这会从该提交中取出文件并放回您的工作目录。
如果您不确定文件何时被删除:
也许您做了很多修改,已不记得到底何时丢了该文件。在这种情况下,使用 git reflog(引用日志):
这会显示您的 Git 提交、签出、重置等操作的完整历史。
但
git reflog仅在本地有效,无法用于远端。如果您与远程仓库协作,用git log -- file.txt来追踪该文件的历史会更好。一旦找到文件仍存在的时间点,像之前一样使用
git checkout或git restore来恢复它。修复 Git 中的“缺失文件”
有时文件会被直接从系统中删除——也许是通过文件管理器、终端 rm 命令,或纯属意外。这种情况下,Git 不会自动清理。它会把这些文件标记为缺失,等待您来正确处理删除。
下面按步骤看看如何应对这种情况。
步骤 1:检查缺失文件
在项目文件夹中运行:
如果 Git 显示某个文件已删除,说明它已从系统中消失,但该更改尚未被暂存。
步骤 2:暂存删除
要告诉 Git 暂存所有更改(包括已删除文件),运行:
这会将所有文件更改(新增、修改、删除)加入暂存区。然后提交更新:
这是最安全的清理方式,因为它能一次性捕捉到所有更改。
步骤 3:推送到远程
如果您在使用远程仓库,推送该提交:
将
<branch-name>替换为工作分支,如main或dev。步骤 4:另一种方式
假设您手动删除了一堆文件,可能是误删,也可能是在清理时删的。Git 仍会认为这些文件存在,直到您另行告知。
如果不想对每个文件都用
git rm,可以用更快的方法来清理。在终端运行:
它的作用是:
git ls-files --deleted列出所有被 Git 跟踪但现在已在磁盘上缺失的文件。xargs -0 git rm将这些文件名传给git rm,从 Git 索引中移除它们。当您在大型项目中想要快速清理时,这非常有用。
注意:我收到此消息,是因为当前没有被跟踪但在磁盘上缺失的文件。
Git 的高级文件删除
现在我们已覆盖基础内容,来看一些删除文件并非“运行
git rm就完事”的高级场景。这些情况要么涉及敏感数据,要么需要谨慎清理未跟踪文件。从 Git 中移除敏感数据
有时包含私密数据的文件(如 API 密钥或密码)会被意外提交。单纯删除并无帮助。因为 Git 保留完整历史,该文件仍存在于早期提交中。
要彻底抹除它,您可以使用
git filter-repo命令:git filter-repo(推荐)这是
filter-branch的更新、更好的替代方案。它更快、更安全,也更易用。首先安装它(需要 Python 和 pip):
然后运行:
这会从您仓库的每一次提交中移除
hide.txt文件。要确认,运行:
如果文件确实消失了,把它加入
.gitignore,避免再次被跟踪:如果您在团队中协作,清理并重写历史后需要强制推送变更:
然后通知您的队友。他们需要重新克隆或重置各自的本地副本,以避免错误。
使用 git clean 清理未跟踪文件
逐条说明:
git rm,然后提交。要删除未跟踪的文件或文件夹,请使用
git clean。以下是最实用的选项:
含义如下:
-n表示仅预览。-f表示强制删除。-d表示在清理中包含文件夹。注意:
git clean不会碰被跟踪的文件。但它会删除所有未跟踪的内容,哪怕是您本想保留的。因此,务必先用-n预览将要删除的内容。在 GitHub 与 GUI 工具中删除文件
以上我们主要使用命令行。但并非所有人都这样工作,这完全没问题。一些开发者在 GitHub 中直接使用可视化工具。
接下来看看在 GitHub 网页界面和其他 GUI 工具中如何删除文件,并比较它们与命令行的差异。
在 GitHub 网站中删除文件
如果您在 GitHub 的浏览器界面中工作,可以无需终端就删除文件。
以下是在 2025 界面中的操作方式:
随后 GitHub 会显示一个提交信息框。添加简短信息,例如:
您也可以写一个可选的描述。
接着选择如何保存更改:
main分支点击 Commit changes,GitHub 会删除该文件,并将此删除作为一次提交保存,就像在命令行中使用
git rm一样。使用 Git GUI 工具删除文件
如果您使用 Git GUI 工具,如 GitHub Desktop、Sourcetree 或 Tower,流程也很简单:
各工具界面略有不同,但工作流相似:您以可视化方式跟踪更改,准备好后再提交。
按平台的最佳实践
下面简要看下不同平台中的文件删除工作原理,以及各自适用场景:
Git 文件删除的最佳实践
在 Git 中删除文件看似简单,但一步走错就可能破坏代码。以下是我在共享或长期项目中确保删除操作安全可控的一些实用建议。
删除前务必确认
在删除文件前,花一分钟确认它的作用:
git status查看它是否已暂存或被修改。git log -- <filename>查看其提交历史。这个快速检查能帮我省去日后成小时的恢复工作。
使用原子提交
“原子提交”指的是每个逻辑更改对应一次提交。
例如,如果我在删除未使用的文件,我只提交这些删除,与代码编辑分开。
这样做的好处包括:
git bisect等工具效果更好。在重写历史时谨慎协作
使用
git filter-repo等工具重写历史会影响团队中的所有人。为避免混乱:git push --force,因为它会改写远端历史。在执行破坏性命令前使用 --dry-run
在运行会删除文件的命令前,务必先测试:
这会显示可能被删除的内容,而不会真正删除。我认为您总该这么做的原因是:
结合使用 git rm --cached 与 .gitignore
如果您不小心提交了不该放入仓库的内容(如配置文件或日志),分两步修复:
这会告诉 Git 停止跟踪该文件,但保留在您的电脑上。
gitignore:这样做的好处是:
.env、.log或node_modules)排除在仓库之外。Git 边缘场景:暂存与空文件夹
有时删除文件并不会按预期进行。您可能会错误暂存了文件,或遇到空文件夹的问题。
下面是我常用的处理方法。
取消暂存而不丢失修改
假设我运行了
git add .,不小心把不该暂存的文件也暂存了。我不想丢失修改——只想把它从暂存区移除。为此我运行:
这会取消暂存,但保留编辑内容。
要确认,使用:
现在该文件应显示为“modified”而非“staged”。
在仓库中保留空文件夹
默认情况下,Git 会忽略空文件夹。如果我尝试提交一个空文件夹,Git 会跳过它。
但有时我希望在仓库中保留该文件夹,以便将来存放日志或上传文件。常见做法是添加一个占位文件
.gitkeep。操作如下:
这会让文件夹“非空”,从而被 Git 跟踪。
注意:
.gitkeep并非 Git 内置,只是一种约定。您可以任意命名该文件,但.gitkeep能向他人说明其用途。Git 文件删除常见问题排查
下面是我在 Git 中删除文件时遇到的一些常见问题及其解决方法。
文件仍出现在远程仓库中
您删除了文件并提交了更改,但它仍在远程仓库中。可能是您忘记推送了。
请确保运行:
还要检查:
子模块相关问题
子模块是嵌在其他 Git 仓库中的 Git 仓库。它们的行为与普通文件夹不同。
如果您要删除子模块内的文件:
如果您要彻底移除子模块:
.gitmodules和.git/config中的相关引用分离的 HEAD 状态
在 Git 中,
HEAD通常指向当前分支。但有时它会指向某个具体提交,这被称为“分离的 HEAD”。可能发生在您:
检查当前状态:
如果您看到:
说明您不在任何分支上,切走后新更改可能会丢失。
修复方法如下:
如果您已经有更改并想保留,运行:
这会把您的工作放到一个新分支上并保存。
如果您已经提交了更改,并想稍后把它们移到另一个分支,执行:
如果您没有做任何更改,只想退出分离的 HEAD,运行:
就是这样。您的 HEAD 已重新附着,一切恢复正常。
权限或状态错误
有时 Git 无法删除文件,尤其是在 Windows 上。通常是因为:
解决方法:
合并或变基问题
如果您看到如下错误:
您很可能正处于合并或变基过程中。
在解决冲突后完成变基:
要完全取消变基或合并:
这会将仓库恢复到开始合并之前的状态。
想丢弃所有本地更改并重置工作目录?
试试:
这会把所有文件恢复到上次提交的状态。
结语
在 Git 中删除文件时,如果不留心,很容易出错。一个小失误就可能引发更严重的问题:代码损坏、工作丢失,或者团队协作混乱。因此,请花点时间再次确认您在做什么。
根据场景使用正确的命令。如果不确定某个操作的效果,先用 dry run 测试。如果您与他人协作,请确保大家达成一致。
除了删除文件,Git 还能做更多事。您可以删除分支、用 reset 和 revert 撤销错误,或用 git diff 精确查看变更。 学得越多,工作流就越顺畅。
一步一步来,您就能掌握这些技巧。