You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从staging area移除文件时git rm与git restore的区别是什么?

git rm 与 git restore 从暂存区移除文件的差异

核心功能差异

  • git rm:本质是同时操作暂存区和工作目录的删除类命令,默认行为是把目标文件从暂存区、工作目录同时删除,并且将删除操作直接加入下次提交的变更列表。如果仅要从暂存区移除、不删除工作区文件,需要额外加--cached参数。
  • git restore:专门用于撤销变更的工具类命令,默认仅实现暂存区/工作目录的内容恢复,不会主动生成删除待提交记录。要实现从暂存区移除变更的效果需要加--staged参数,仅撤销文件在暂存区的修改,完全不触碰工作目录的文件内容。

适用场景差异

  • 选择git rm --cached的场景:
    • 确定要把目标文件从Git的追踪列表中完全移除,但需要保留本地工作副本,比如之前误将本地私有配置文件提交到仓库,现在要把该文件加入.gitignore,同时把已经提交的配置文件从仓库记录中删除、但本地留着正常使用
    • 需要彻底删除某个已追踪的文件,且该删除动作要同步提交到远程仓库,不需要保留本地副本时直接用无参数的git rm即可
  • 选择git restore --staged的场景:
    • 不小心把还未改完的文件通过git add加入了暂存区,想撤回到工作区继续修改,完全不影响已经编写的代码内容
    • 仅需要撤销暂存区的某次add操作,不需要修改文件本身,也不需要把文件从Git追踪列表中移除

操作后效果差异

举实际场景示例:假设你有一个已经被Git追踪的文件test.txt,修改内容后执行了git add test.txt把变更加入暂存区,此时分别执行两个命令的效果如下:

  • 执行git rm --cached test.txt:
    1. 暂存区会生成一条test.txt的删除变更记录,下次执行git commit时,该文件会被从仓库记录中彻底删除
    2. 工作目录中的test.txt会被保留,但状态变为未被Git追踪的新文件
  • 执行git restore --staged test.txt:
    1. 暂存区里test.txt的新增变更会被撤销,恢复到和上次提交一致的状态,不会产生删除待提交记录
    2. 工作目录中test.txt的修改内容完全保留,状态变回「已修改未暂存」,依然属于Git的追踪文件范围

补充说明:如果是从未被Git追踪过的新文件,执行git add加入暂存区后想要移除,两种命令效果一致:都会把文件从暂存区清除、变回未追踪状态,不会删除本地文件。

内容的提问来源于stack exchange,提问作者Helsinki Red

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:24:02