Git:取消暂存区更改或停止追踪文件

204 阅读3分钟

命令git rm --cached -r 某个或数个文件 作用:从 暂存区(Stage)和 Git 版本控制 中移除文件,但 保留工作区的文件(不会物理删除文件)。 适用场景

  • 你误将某些文件(如临时文件、日志、编译产物)添加到 Git 跟踪,现在想 停止跟踪(untrack),但仍然保留文件在本地。
  • 常用于 .gitignore 更新后,移除已被跟踪但不应纳入版本控制的文件。 最佳实践: 不要用.匹配所有文件;

如果文件较多,可以使用 find 命令结合 git rm --cached 批量移除:

find . -name ".flattened-pom.xml" -exec git rm --cached {} \;
  • 该命令会查找所有 .flattened-pom.xml 文件,并将其从 Git 的索引中移除。

如果其他开发者已经拉取了包含这些文件的仓库,他们也需要运行 git rm --cached 来停止跟踪这些文件。

如果文件已经被提交到 Git 历史记录中,即使移除跟踪,历史记录中仍然会保留该文件。如果需要彻底清除历史记录中的文件,可以使用 git filter-repoBFG Repo-Cleaner 工具。

常用组合

根据你想实现的目标,选择以下解决方案之一:

1. 如果你想保留暂存区

提交你的更改:最安全和最常见的解决方案是在从缓存中删除文件之前提交当前已暂存的更改。

git commit -m "你的提交信息" # 提交已暂存的更改
git rm --cached -r .

2. 如果你想保留工作目录中的更改(并丢弃已暂存的更改)

重置已暂存的更改:这将丢弃你添加到暂存区的更改,并使暂存区与你的工作目录匹配。

git reset . # 清理暂存区
git rm --cached -r 某个或数个文件

3. 如果你想丢弃 所有 更改(包括已暂存的和工作目录中的)对于这些文件

检出已提交的版本:这会将你的工作目录和暂存区中的文件恢复到上次提交的版本。

git checkout HEAD . # 它的作用是 用最近一次提交(HEAD)的内容覆盖当前工作目录(和暂存区)的所有文件,但不会影响未跟踪的文件(untracked files)
git rm --cached -r .

4. 强制删除(谨慎使用!)

强制删除git rm --cached -rf .

  • -f(强制)选项将绕过安全检查,并从缓存中删除文件,无论差异如何。
  • 仅当你完全确定你在做什么并愿意丢失更改时,才使用此选项。这通常 建议。

Git 错误处理:git rm --cached 阻止删除文件

错误信息

staged content different from both the file and the HEAD

错误原因

Git 阻止你从缓存中删除文件 (--cached),因为这些文件在暂存区(index)中的更改与当前已提交的版本(HEAD)和磁盘上的版本都不同。这是为了防止你意外丢失工作。

这种差异通常发生在你对文件进行了更改,将这些更改添加到暂存区(使用 git add),然后 进一步 更改了工作目录中的同一文件 而没有暂存它们 时。