Play Open
Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait

Git 文件删除指南:从基础到高级,彻底掌握版本控制中的文件管理

在 Git 中删除文件并非总是直截了当。你可能从文件系统中删除了一个文件,但这并不意味着它就从你的仓库中消失了。它可能仍然存在于你的历史记录中,甚至可能因为意外被提交,比如一个配置文件或一个 API key。

本指南将带你深入了解如何在 Git 中删除文件。我们将从 git rm 等基本命令开始,然后探讨清理未跟踪文件以及编辑提交历史等更高级的方法。

前置条件

在开始使用 Git 删除文件之前,请确保一切都已就绪。

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

git --version

如果看到版本号,说明 Git 已安装。

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

请确保你拥有在仓库中进行更改的权限,尤其是在团队协作或使用远程仓库(如 GitHub 或 GitLab)时。

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

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

Git 文件删除基础

根据你的需求,Git 中有几种不同的方法可以删除文件。让我们来看一些常见的选项:

使用 git rm

git rm 命令用于从你的 Git 仓库中删除文件。当你运行此命令时,会发生两件事:

Git 从你的工作目录中删除文件。

它将此更改暂存到下一次提交。

git rm 不仅仅是删除文件,它还会追踪删除操作并将其记录在你的历史中。一旦你提交,该文件就正式从项目中移除了。

git rm file1.txt

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

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

git rm *.log

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

git status

如果你想删除文件夹内的所有文件,但保留文件夹本身,可以使用:

git rm temp/*

这会删除 temp 文件夹内的所有文件,而不删除 temp 文件夹本身。

Git 还增加了一些安全检查。如果一个文件有尚未提交的更改,Git 不会删除它,除非你强制执行。所以,只有当你确定这些更改可以被丢弃时才使用:

git rm -f

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

git rm -r testfolder

这会删除 testfolder 及其内部所有文件。

现在,要提交此更改,运行以下命令:

git commit -m "removed log files"

关键 git rm 选项

以下是你在使用 git rm 时最常用的选项:

1.

这是最基本的用法。只需列出你要删除的文件:

git rm file1.txt file2.txt

你也可以使用通配符删除同一类型的多个文件。例如,删除所有 .txt 文件:

git rm *.txt

(这里的 * 表示所有,它匹配任何以 .txt 结尾的文件名。)

2. --cached

此选项将文件从仓库中删除,但保留在你的本地计算机上。假设你不小心添加了一个敏感文件,如 config.env。你不想让它进入仓库,但仍需要在本地使用。这时,你可以运行:

git rm --cached config.env

在这里,git rm 会将其从仓库中删除并从 Git 追踪中移除(这样它就不会被推送),但文件本身仍会保留在你的物理磁盘上。

为了防止它再次被添加,请将其添加到 .gitignore 文件中:

echo config.env >> .gitignore

3. -r

-r 代表递归。此选项会递归删除目录及其内容,而不仅仅是单个文件。如果没有这个选项,如果你尝试删除一个文件夹,Git 会报错。

git rm -r

例如,如果 testfolder 包含 a.txt 和 b.txt,运行 git rm -r testfolder 将删除该文件夹及其所有内容和文件。

4. --dry-run

如果你不确定删除文件会发生什么,请使用 git rm 和 --dry-run 选项:

git rm --dry-run

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

或者,如果你正在清理未跟踪的文件,并想仔细检查将要删除的内容,可以使用:

git clean -n

这只会显示该命令将删除什么。

git rm 与手动删除的对比分析

Git 中有不止一种方式来删除文件。这些方法可能看起来相似,但它们的行为方式不同。

假设有一个名为 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.txt

git commit -m "Remove file.txt"

无需单独运行 git add。这种方式更简洁,并且你不会忘记暂存删除。

简而言之:

手动删除需要额外的步骤来确保 Git 识别更改。

如果你忘记暂存删除,Git 仍会认为文件存在,这可能在提交或合并时造成混淆。

当你需要有意识地删除已跟踪文件时,git rm 更简洁、更安全。

恢复 Git 中已删除的文件

如果你删除了一个文件,后来发现仍需要它怎么办?没问题。Git 提供几种方法来恢复它,具体取决于你何时发现错误。

如果你尚未提交:

假设你删除了文件但尚未提交更改。你可以从上次提交中恢复它,像这样:

git restore file.txt

这会将文件从最新提交中恢复到你的工作目录。

如果你已经提交了删除操作:

那也没关系。首先,找到文件仍然存在的最后一次提交:

git log -- file.txt

浏览日志并复制文件仍存在的提交哈希(commit hash)。然后运行:

git checkout -- file.txt

在 Git 的旧版本中可以使用上述命令。这个命令从特定提交中恢复文件,但也可能切换分支。

从 Git 2.23 开始,这个功能被拆分为两个更清晰的命令:

git switch(用于切换分支)

git restore(用于恢复文件)

如果你只想从某个提交中恢复文件,请使用:

git restore --source= -- file.txt

这会将文件从该提交中拉取出来,并放回你的工作目录。

如果你不确定文件何时被删除:

也许你进行了一系列更改,不记得文件何时丢失。在这种情况下,请使用 git reflog 或引用日志:

git reflog

这会显示你的 Git 提交、检出、重置等所有操作的完整历史记录。

但 git reflog 仅限于本地,不能在远程仓库上工作。如果你正在使用远程仓库,最好使用 git log -- file.txt 来追踪该文件的历史。

一旦找到文件仍然存在的点,就可以像之前一样使用 git checkout 或 git restore 恢复它。

修复 Git 中丢失的文件

有时文件会直接从文件系统中删除——可能通过文件浏览器、终端的 rm 命令,甚至是意外删除。当这种情况发生时,Git 不会自动清理。相反,它会将这些文件标记为丢失,并等待你正确处理删除操作。

让我们一步一步看看如何处理这种情况。

步骤 1:检查丢失的文件

在你的项目文件夹中运行:

git status

如果 Git 说一个文件已删除(deleted),这意味着它已从你的系统消失,但更改尚未暂存。

步骤 2:暂存删除操作

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

git add -A

git add -A = 暂存所有更改(新增、修改、删除)。

git add -u = 暂存修改 + 删除,但不包括新文件。

这会暂存所有文件更改:新增、修改和删除。然后提交更新:

git commit -m "Removed missing files"

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

步骤 3:推送到远程仓库

如果你正在使用远程仓库,请推送提交:

git push origin

替换为你的工作分支,如 main 或 dev。

步骤 4:另一种方法

假设你手动删除了一堆文件,可能是意外,也可能是在清理时。在你告诉 Git 之前,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 中删除文件并不像运行 git rm 那么简单。这些情况涉及敏感数据或需要仔细清理未跟踪文件。

从 Git 中删除敏感数据

有时,包含私人数据(如 API key 或密码)的文件会被意外提交。正常删除它无济于事,因为 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

然后通知你的队友。他们需要重新克隆(re-clone)或重置(reset)他们的本地副本以避免错误。

使用 git clean 清理未跟踪的文件

我们来分解一下:

已跟踪文件:在 Git 的历史记录中。要删除它们,使用 git rm,然后提交。

未跟踪文件:根本不在 Git 中。这些文件可能会堆积并使你的项目变得混乱。

要删除未跟踪的文件或文件夹,请使用 git clean。

以下是最有用的选项:

git clean -n # 显示将删除哪些未跟踪文件

git clean -nd # 显示将删除哪些未跟踪文件夹

git clean -fd # 强制删除所有未跟踪文件和文件夹。这是破坏性的。

这里:

-n 表示只预览。

-f 表示强制删除。

-d 包括文件夹在清理范围。

注意:git clean 不会触及已跟踪的文件。但它会删除任何未跟踪的文件,即使是你打算保留的文件。因此,请务必先使用 -n 选项来查看它将删除什么。

GitHub 及 GUI 工具中的文件删除

到目前为止,我们讨论的大部分内容都使用了命令行。但并非所有人都以这种方式工作,这完全没问题。有些开发者在使用 GitHub 时会使用可视化工具。

那么,让我们看看在 GitHub 的 Web 界面和其他 GUI 工具中删除文件是如何工作的,以及它与命令行的对比。

在 GitHub 网站上删除文件

如果你在 GitHub 的浏览器界面中工作,无需使用终端即可删除文件。

在 2025 年的界面中,操作如下:

打开要删除的文件。

点击右上角的三个点。

从下拉菜单中选择 Delete file。

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

Delete practice.py

你也可以编写可选的描述。

接下来,选择如何保存更改:

直接提交到 main 分支。

或者创建一个新分支并启动一个拉取请求(pull request)(推荐用于团队工作流)。

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

使用 Git GUI 工具删除文件

如果你使用 Git GUI 工具,如 GitHub Desktop、Sourcetree 或 Tower,操作过程也很简单:

在文件浏览器或应用程序中删除文件。

应用程序会在 “Changes” 或 “File Status” 下显示删除操作。

查看、暂存并提交更改。

每个工具看起来略有不同,但工作流程相似:你通过可视化方式跟踪更改,并在准备就绪时提交。

按平台划分的最佳实践

以下是文件删除在不同平台上的工作方式,以及何时使用每种方法:

GitHub (Web):适用于快速修复和小更新。避免用于大型清理或敏感文件。

Git GUI 工具:非常适合日常工作。易于查看更改并安全提交。

命令行:最灵活、最有用。最适合高级任务,如批量编辑或历史更改。

Git 文件删除最佳实践

在 Git 中删除文件可能看起来很简单,但一个错误的步骤就可能破坏你的代码。以下是我用于确保删除操作安全可控的一些实用技巧,尤其是在共享或长期项目中。

删除前务必验证

在删除文件之前,花一分钟确认它正在做什么:

运行 git status 查看它是否已暂存或已修改。

使用 git log -- 检查其提交历史。

这种快速检查可以避免以后数小时的恢复工作。

使用原子提交

原子提交意味着每个逻辑更改对应一次提交。

例如,如果我正在删除未使用的文件,我只会提交这些删除操作,与代码编辑分开。

这非常有用的原因如下:

调试更容易。像 git bisect 这样的工具在提交小而专注时效果更好。

提交历史保持清晰整洁。

代码审查速度更快。

谨慎协作重写历史

使用 git filter-repo 等工具重写历史会影响团队中的每个人。为避免混乱:

在重写共享分支之前进行沟通。

谨慎使用 git push --force,因为它会重写远程历史。

之后告知队友重新克隆或重置其本地仓库。

在运行破坏性命令前使用 --dry-run

在运行删除文件的命令之前,务必先测试它:

git clean -n

这会显示将删除什么,但不会实际删除任何东西。以下是我认为你应该始终这样做的原因:

它能阻止你删除实际想保留的文件。

它是一个安全网,特别是在大型项目中,一个错误就可能擦除日志或生成的文件。

将 git rm --cached 与 .gitignore 结合使用

如果你不小心提交了不应该在仓库中的文件(例如配置文件或日志),可以通过两个步骤修复:

取消跟踪文件:

git rm --cached

这会告诉 Git 停止跟踪该文件,但将其保留在你的计算机上。

将其添加到 .gitignore:

echo >> .gitignore

这很有用的原因如下:

将敏感或本地文件(如 .env、.log 或 node_modules)排除在仓库之外。

防止 Git 历史混乱。

对这些文件的未来编辑不会触发 Git 中的更改。

Git 文件删除的边界情况:暂存与空文件夹

有时文件删除不会按预期进行。你可能会暂存错误的文件,或遇到空文件夹的问题。

以下是我处理常见边界情况的方法。

取消暂存文件而不删除你的更改

假设我运行了 git add . 并且不小心暂存了一个我不想暂存的文件。我不想丢失我的更改——我只想取消暂存它。

要修复这个问题,我运行:

git reset HEAD

这会取消暂存文件,但保留编辑。

要确认,我使用:

git status

现在文件应该显示为 “modified” 而不是 “staged”。

在仓库中保留空文件夹

默认情况下,Git 会忽略空文件夹。如果我尝试提交一个没有文件的文件夹,Git 会跳过它。

但有时我想将该文件夹保留在仓库中,无论是用于将来的日志还是上传。通常的解决方法是添加一个名为 .gitkeep 的占位符文件。

操作如下:

touch logs/.gitkeep

git add logs/.gitkeep

git commit -m "Keep logs folder in the repo"

这使得文件夹“非空”,因此 Git 会跟踪它。

注意:.gitkeep 不是 Git 内置的。它只是一种约定。你可以将文件命名为任何名称,但 .gitkeep 会告诉其他人它的用途。

Git 文件删除故障排除

以下是我在 Git 中删除文件时遇到的一些常见问题以及如何修复它们。

文件仍然出现在远程仓库中

你删除了文件,提交了更改,但它仍然在远程仓库中。也许你忘记了推送(push)。

因此,请确保运行:

git push origin

另外检查:

你是否在正确的分支上?

你的提交是否真的包含了文件删除?

子模块(Submodules)问题

子模块是其他 Git 仓库内部的 Git 仓库。它们的行为不像普通文件夹。

如果你正在删除子模块内的文件:

进入子模块文件夹

在该子模块内部提交并推送更改

如果你正在完全删除子模块:

删除子模块文件夹

删除 .gitmodules 和 .git/config 中的所有引用

分离 HEAD 状态(Detached HEAD State)

在 Git 中,HEAD 通常指向当前分支。但有时它指向特定的提交而不是分支,这被称为分离 HEAD。

这会在以下情况发生:

你通过其哈希值检出(checkout)了一个提交。

切换到标签(tag)。

检出远程分支但未将其设置为跟踪。

检查你的状态:

git status

如果你看到:

HEAD detached at

你不在任何分支上,当你切换离开时,任何新的更改都可能丢失。

以下是修复方法:

如果你已经做了更改并想保留它们,运行此命令:

git checkout -b

这会将你的工作放在一个新分支上并保存它。

如果你已经提交了更改并想稍后将它们移动到另一个分支,请这样做:

git checkout -b temp-branch # 从分离 HEAD

git checkout main # 或另一个目标分支

git merge temp-branch

如果你没有做任何更改,只是想摆脱分离 HEAD 状态,运行此命令:

git checkout

就这样。你的 HEAD 现在已重新连接,一切都恢复正常。

权限或状态错误

有时 Git 无法删除文件,通常在 Windows 上。这可能发生在以下情况:

文件在另一个程序中打开。

Git 没有更新它的权限。

以下是修复方法:

关闭任何正在使用该文件的应用程序。

以管理员身份重启你的终端(在 Windows 上)。

合并或变基(Merge or Rebase)问题

如果你看到类似这样的错误:

you are not currently on a branch

merge conflict

你很可能正处于合并或变基过程中。

在解决冲突后完成变基:

git rebase --continue

要完全取消变基或合并:

git reset --merge

这会将你的仓库恢复到合并开始之前的状态。

想丢弃所有本地更改并重置你的工作目录?

试试这个:

git restore .

这会将所有文件恢复到它们最后一次提交的状态。

总结

在 Git 中删除文件时,如果不注意,很容易搞砸。一个微小的错误可能导致更大的问题:代码损坏、工作丢失或团队混乱。这就是为什么,花点时间仔细检查你正在做什么。

根据具体情况使用正确的命令。如果你不确定某个命令会做什么,请先使用 --dry-run 进行测试。如果你正在与他人合作,请确保每个人都在同一页面上。

Git 文件删除常见问题解答

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

暂存意味着将更改准备好用于下一次提交。当你运行 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 使用远程仓库的最新更改更新你的本地分支。它从远程获取新的提交,然后将它们合并到你当前的分支中。

关于

关注我获取更多资讯

📢 公众号

💬 个人号

本文链接地址:https://blog.eimoon.com/p/git-remove-files-guide/

作者:eimoon.com

分享转载说明:本文由作者原创,转载请注明出处。

Posted in 点球世界杯
Previous
All posts
Next