为什么用'git rm'而不是'rm'来删除文件?

vbkedwbf  于 2023-01-19  发布在  Git
关注(0)|答案(9)|浏览(115)

在SVN上,直接从文件系统中删除一些东西(而不是使用svn)会带来一大堆麻烦.
我在使用git时没有发现这是一个问题,但我注意到git有自己的rm实现(git rm)。
rmgit rm之间的区别是什么?

xwmevbvl

xwmevbvl1#

如果您只是使用rm,则需要使用git add <fileRemoved>进行后续操作。git rm只需一步即可完成此操作。
您也可以使用git rm --cached,它将从索引中删除文件(暂存它以便在下次提交时删除),但将副本保留在本地文件系统中。

x8goxv8g

x8goxv8g2#

使用rm删除文件本身不是问题,但是如果您希望提交文件已被删除,则无论如何都必须执行git rm,因此您最好立即执行此操作。
另外,根据你的shell,在删除文件后执行git rm,你将不会得到制表符完成,所以你必须自己拼写出路径,而如果你在文件仍然存在时执行git rm,制表符完成将正常工作。

gdrx4gfi

gdrx4gfi3#

git rm将从索引和工作目录中删除文件(如果使用--cached,则仅从索引中删除),以便为下次提交暂存删除操作。

qhhrdooz

qhhrdooz4#

除了Andy的回答,git rm还有其他实用程序:
1.安全性:当执行git rm而不是rm时,如果文件的HEAD版本与暂存索引或工作树版本之间存在差异,Git将阻止删除操作。此阻止是一种安全机制,用于防止删除正在进行的更改。
1.保障措施git rm --dry-run。此选项是一种保护措施,它将执行git rm命令,但不会实际删除文件。相反,它将输出它将删除的文件。

z0qdvdin

z0qdvdin5#

但是,如果你最终使用rm而不是git rm,你可以跳过git add,直接使用以下命令提交修改:
git commit -a

kuuvgm7e

kuuvgm7e6#

从索引或工作树和索引中删除文件。git rm不会只从工作目录中删除文件。
下面介绍了如何使用rm -f删除文件,然后使用git rm将其从索引中移除

$ rm -f index.html
$ git status -s
 D index.html
$ git rm index.html
rm 'index.html'
$ git status -s
D  index.html

不过,您可以使用git rm一次性完成所有这些操作

$ git status -s
$ git rm index.html
rm 'index.html'
$ ls
lib vendor
$ git status -s
D  index.html
ozxc1zmp

ozxc1zmp7#

当使用git rm时,删除操作将是你下次提交的一部分,所以如果你想推送修改,你应该使用git rm

92dk7w1h

92dk7w1h8#

我想我终于明白了
如果对文件file_a.txt进行更改
然后

git add file_a.txt
rm file_a.txt
git commit -m 'Commit message'

虽然文件从工作目录中删除(即从磁盘中删除,或移动到垃圾箱中),但不会从临时区域中删除,因此临时区域中的更改(即索引)将被提交
如果你不这样做

git add file_a.txt
git rm file_a.txt
git commit -m 'Commit message'

该文件将从磁盘和临时区域中删除,因此不会提交更改
如果在你最后一次提交之后,你做了

rm file_a.txt
git commit -m 'Commit message'

git rm file_a.txt
git commit -m 'Commit message'

这应该没有什么区别,因为您没有向临时区域或索引添加任何更改,因此工作目录中只有该文件的一个副本,因此这两个命令的影响相同
所以总的来说rm只会从磁盘中删除,而不会从暂存区中删除git rm会同时从磁盘和暂存区中删除(一个特殊的git区域,常规的windows或linux命令无法访问)

kkbh8khc

kkbh8khc9#

当用户使用不区分大小写的系统如Windows或MacOS时,git rm在某些情况下比rm更安全。
假设你的git仓库在不区分大小写的系统上有一个名为foo.js的提交文件,你在运行git rm Foo.js时会遇到一个错误,但在运行rm Foo.js时不会。

相关问题