从staging area移除文件时git rm与git restore的区别是什么?
git rm 与 git restore 从暂存区移除文件的差异
核心功能差异
git rm:本质是同时操作暂存区和工作目录的删除类命令,默认行为是把目标文件从暂存区、工作目录同时删除,并且将删除操作直接加入下次提交的变更列表。如果仅要从暂存区移除、不删除工作区文件,需要额外加--cached参数。git restore:专门用于撤销变更的工具类命令,默认仅实现暂存区/工作目录的内容恢复,不会主动生成删除待提交记录。要实现从暂存区移除变更的效果需要加--staged参数,仅撤销文件在暂存区的修改,完全不触碰工作目录的文件内容。
适用场景差异
- 选择
git rm --cached的场景:- 确定要把目标文件从Git的追踪列表中完全移除,但需要保留本地工作副本,比如之前误将本地私有配置文件提交到仓库,现在要把该文件加入
.gitignore,同时把已经提交的配置文件从仓库记录中删除、但本地留着正常使用 - 需要彻底删除某个已追踪的文件,且该删除动作要同步提交到远程仓库,不需要保留本地副本时直接用无参数的
git rm即可
- 确定要把目标文件从Git的追踪列表中完全移除,但需要保留本地工作副本,比如之前误将本地私有配置文件提交到仓库,现在要把该文件加入
- 选择
git restore --staged的场景:- 不小心把还未改完的文件通过
git add加入了暂存区,想撤回到工作区继续修改,完全不影响已经编写的代码内容 - 仅需要撤销暂存区的某次add操作,不需要修改文件本身,也不需要把文件从Git追踪列表中移除
- 不小心把还未改完的文件通过
操作后效果差异
举实际场景示例:假设你有一个已经被Git追踪的文件test.txt,修改内容后执行了git add test.txt把变更加入暂存区,此时分别执行两个命令的效果如下:
- 执行
git rm --cached test.txt:- 暂存区会生成一条
test.txt的删除变更记录,下次执行git commit时,该文件会被从仓库记录中彻底删除 - 工作目录中的
test.txt会被保留,但状态变为未被Git追踪的新文件
- 暂存区会生成一条
- 执行
git restore --staged test.txt:- 暂存区里
test.txt的新增变更会被撤销,恢复到和上次提交一致的状态,不会产生删除待提交记录 - 工作目录中
test.txt的修改内容完全保留,状态变回「已修改未暂存」,依然属于Git的追踪文件范围
- 暂存区里
补充说明:如果是从未被Git追踪过的新文件,执行
git add加入暂存区后想要移除,两种命令效果一致:都会把文件从暂存区清除、变回未追踪状态,不会删除本地文件。
内容的提问来源于stack exchange,提问作者Helsinki Red
相关产品推荐
相关产品推荐

