跳至主要内容

如何在不破坏项目的情况下从 Git 仓库中删除文件

学习如何在 Git 仓库中删除文件,避免常见错误,并在复杂或敏感场景下保持仓库整洁有序。
· 15分钟 阅读

使用 AI 探索

在 Git 中删除文件并不总是看起来那么简单。您从系统中删掉了一个文件,但这并不意味着它已经从仓库中消失。它可能仍然存在于历史记录中,更糟的是,可能会被不小心提交,比如配置文件或 API 密钥。

在本指南中,您将学习如何从 Git 中删除文件。我们将从 git rm 等基础命令开始,然后介绍更高级的方法,如清理未跟踪文件和编辑提交历史。

先决条件

在使用 Git 删除文件之前,先确保一切准备就绪。

首先检查是否已安装 Git。打开终端并运行:

git --version

如果您看到版本号,就可以继续了。 

Installing git

如果您看到版本号,就可以继续了。

如果您更喜欢可视化界面,也可以安装 Git GUI 工具,如 GitHub Desktop、Sourcetree 或 GitKraken。但在本指南中,我将使用命令行(Git Bash)。

请确保您有权在仓库中进行更改,尤其是在团队中或使用 GitHub、GitLab 等远程仓库时。

注意:某些删除操作无法撤销。因此,建议在运行任何删除文件的命令之前备份项目,或至少仔细检查仓库的当前状态。

准备就绪后,我们开始吧。

Git 中的基础文件删除

在 Git 中删除文件有几种方式,取决于您的目标。下面来看一些常见选项:

使用 git rm

git rm 命令会从 Git 仓库中删除文件。运行后会发生两件事:

  • Git 会将该文件从工作目录中移除
  • 并将该更改加入暂存区,等待下次提交

但 Git 不仅仅是删除文件。它还会在历史记录中追踪这次删除。一旦您提交,该文件就会正式从项目中移除。

git rm file1.txt

deleting a file using the git rm command.

您可以删除一个文件、多个文件,或使用通配符删除一组文件。 

例如,删除所有日志文件:

git rm *.log

这会告诉 Git 删除该文件夹中所有以 .log 结尾的文件。您可以使用以下命令确认更改:

git status

Deleting multiple files with one git rm command.

使用一次 git rm 命令删除多个文件。图片由作者提供。

想删除某个文件夹内的所有文件,但保留文件夹本身?使用:

git rm temp/*

这会删除 temp 文件夹中的所有文件,但不会删除该文件夹本身。

Deleting files inside a folder using git rm command.

Git 也提供了一些安全检查。如果文件有未提交的更改,除非您强制删除,否则 Git 不会删除它。所以只有在确认这些更改可以丢弃时才使用:

git rm -f

Removing uncommitted file using the -f option.

要删除整个文件夹及其中所有内容,添加 -r 标志:

git rm -r testfolder

这会删除 testfolder 及其中的所有文件。

Removing the entire folder and its content using the git rm -r command.

现在,提交这些更改,运行以下命令:

git commit -m "removed log files”

Commit the deletion with git commit command.

常用 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

Stop tracking the file using the --cached option in git rm.

3. -r

表示递归。与其删除单个文件,它会递归删除目录及其内容。如果不加该选项,尝试删除文件夹时 Git 会报错。

git rm -r <folder-name>

这里,我创建了一个名为 testfolder 的文件夹,里面有两个文件:a.txt 和 b.txt. 接着,我运行如下命令:

git rm -r testfolder

这样就删除了该文件夹以及其中的所有内容和文件。

Remove the entire folder using the -r option.

4. --dry-run

如果您不确定删除某个文件会发生什么,可以将 git rm 与 --dry-run 选项一起使用:

git rm --dry-run <filename>

这是一种安全的方式来预览将被删除的内容。 

Preview the files before removing with the --dry-run option.

或者,如果您在清理未跟踪的文件并想再次确认会删除什么,请使用:

git clean -n

这只会显示该命令会删除的内容。

Preview the untracked file before deleting with git clean -n command.

工作流对比分析

在 Git 中删除文件不止一种方式。方法看起来类似,但行为并不相同。

git rm 与手动删除

以一个名为 file.txt 的文件为例。假设我不再需要它。

一种方法是在系统中直接删除它。

在 Linux、macOS 或 Git Bash 上:

rm file.txt

在 Windows(命令提示符)上: 

del file.txt

Remove the file with rm command and check the status with git status command.

这会从文件夹中删除该文件。但 Git 还不知道这件事。因此您需要手动告诉 Git 文件已被删除:

git add file.txt

这会将“删除”动作放入暂存区,从而在下次提交中包含该删除。

Stage the deletion with the git add command.

如果您删除了多个文件且不记得都有哪些,可以运行:

git add -u

这会将所有被跟踪文件的修改或删除加入暂存区。它不会包含未跟踪文件。

然后提交更改:

git commit -m "Remove file.txt"

如果使用 git rm,则一步到位。它会删除文件并立刻将更改加入暂存区:

git rm file.txtgit commit -m "Remove file.txt"

无需单独运行 git add。更简洁,也不容易忘记暂存删除操作。

The git rm command deletes and stages the file in one go.

简而言之:

  • 手动删除需要额外步骤来确保 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

Check the file with the git status command.

如果 Git 显示某个文件已删除,说明它已从系统中消失,但该更改尚未被暂存。

步骤 2:暂存删除 

要告诉 Git 暂存所有更改(包括已删除文件),运行:

git add -A
  • git add -A = 暂存所有更改(新增、修改、删除)。
  • git add -u = 暂存修改 + 删除,但不包含新增文件。

这会将所有文件更改(新增、修改、删除)加入暂存区。然后提交更新:

git commit -m "Removed missing files"

Stage everything with the git add -A command.

这是最安全的清理方式,因为它能一次性捕捉到所有更改。

步骤 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 索引中移除它们。

当您在大型项目中想要快速清理时,这非常有用。

Automatically remove all missing files.

注意:我收到此消息,是因为当前没有被跟踪但在磁盘上缺失的文件。

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.

Use the git clean command to delete and untrack the files

含义如下:

  • -n 表示仅预览。
  • -f 表示强制删除。
  • -d 表示在清理中包含文件夹。

注意:git clean 不会碰被跟踪的文件。但它会删除所有未跟踪的内容,哪怕是您本想保留的。因此,务必先用 -n 预览将要删除的内容。

在 GitHub 与 GUI 工具中删除文件

以上我们主要使用命令行。但并非所有人都这样工作,这完全没问题。一些开发者在 GitHub 中直接使用可视化工具。

接下来看看在 GitHub 网页界面和其他 GUI 工具中如何删除文件,并比较它们与命令行的差异。

在 GitHub 网站中删除文件

如果您在 GitHub 的浏览器界面中工作,可以无需终端就删除文件。

以下是在 2025 界面中的操作方式:

  1. 打开您要删除的文件。
  2. 点击右上角的三个点。
  3. 在下拉菜单中选择 Delete file。

Deleting the file in the GitHub web interface

随后 GitHub 会显示一个提交信息框。添加简短信息,例如:

Delete practice.py

您也可以写一个可选的描述。

接着选择如何保存更改:

  • 直接提交到 main 分支
  • 或创建新分支并发起拉取请求(推荐用于团队协作)

点击 Commit changes,GitHub 会删除该文件,并将此删除作为一次提交保存,就像在命令行中使用 git rm 一样。

使用 Git GUI 工具删除文件

如果您使用 Git GUI 工具,如 GitHub Desktop、Sourcetree 或 Tower,流程也很简单:

  1. 在文件管理器或应用内删除文件。
  2. 应用会在“Changes”或“File Status”中显示该删除。
  3. 检查、暂存并提交更改。

各工具界面略有不同,但工作流相似:您以可视化方式跟踪更改,准备好后再提交。

按平台的最佳实践

下面简要看下不同平台中的文件删除工作原理,以及各自适用场景:

  • 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

如果您不小心提交了不该放入仓库的内容(如配置文件或日志),分两步修复:

  1. 取消跟踪该文件:```git rm --cached <filename>
git rm --cached <filename>

这会告诉 Git 停止跟踪该文件,但保留在您的电脑上。

  1. 将其加入 .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>

说明您不在任何分支上,切走后新更改可能会丢失。

HEAD Detached in removing the file in git

修复方法如下: 

如果您已经有更改并想保留,运行:

git checkout -b <new-branch-name>

这会把您的工作放到一个新分支上并保存。

HEAD Reattached in git

如果您已经提交了更改,并想稍后把它们移到另一个分支,执行:

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 上。通常是因为:

  • 该文件正被其他程序占用
  • Git 没有权限更新它

解决方法:

  • 关闭任何使用该文件的应用
  • 以管理员身份重启终端(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 删除文件常见问答

“暂存删除”是什么意思?

暂存(staging)指的是为下一次提交准备更改。当您运行 git rm filename 时,Git 会从您的文件夹中删除该文件,并将此删除准备好在下一次提交中保存,这称为“暂存删除”。在您运行 git commit 之前,更改并不会永久生效。

git rm 与 rm 有何区别?

rm 只会从您的本地文件夹中删除文件。除非您另行指定,否则 Git 不会跟踪此更改。 

git rm 会删除文件并将该删除操作暂存到下一次提交中,因此 Git 也会从仓库中删除它。

何时应使用 git push origin 而非 git push?

使用场景如下:

  • 如果您的分支已连接到某个远端,使用 git push。
  • 当您想明确指定要推送到哪个远端(例如推送新分支或存在多个远端时),使用 git push origin。
git pull 有什么作用?

git pull 会用远程的最新更改更新您的本地分支。它会从远端获取新提交,并将其合并到您当前的分支。

Laiba Siddiqui

作者

Laiba Siddiqui

我是内容策略专家,热衷于将复杂主题化繁为简。我曾帮助 Splunk、Hackernoon 和 Tiiny Host 等公司为其受众打造兼具吸引力与信息量的内容。

主题