在SVN上,直接从文件系统中删除某些内容(而不是使用SVN)会带来许多令人头痛的问题。

在使用git时,我没有发现这是一个问题,但我注意到git有自己的rm实现(git rm)。

rm和git rm有什么区别?


当前回答

我想我终于明白了

如果您对文件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'

or

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

这应该没有区别,因为您没有向暂存区域或索引添加任何更改,因此工作目录中只有一个文件副本,因此这两个命令将具有相同的影响

因此,在summary中,rm只是从磁盘中删除,而不是从staging区域中删除 Git rm将从磁盘和暂存区(普通Windows或Linux命令无法到达的特殊Git区域)中删除。

其他回答

当使用git rm时,删除将是你下次提交的一部分。因此,如果您想要推动更改,您应该使用git rm

使用rm删除文件本身不是一个问题,但是如果你想提交文件被删除了,你将不得不执行git rm,所以你最好立即这样做。

此外,取决于你的shell,在删除文件后执行git rm,你将不会得到制表符自动完成,所以你必须自己拼写路径,而如果你在文件仍然存在时执行git rm,制表符自动完成将正常工作。

我想我终于明白了

如果您对文件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'

or

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

这应该没有区别,因为您没有向暂存区域或索引添加任何更改,因此工作目录中只有一个文件副本,因此这两个命令将具有相同的影响

因此,在summary中,rm只是从磁盘中删除,而不是从staging区域中删除 Git rm将从磁盘和暂存区(普通Windows或Linux命令无法到达的特殊Git区域)中删除。

Git rm将从索引和工作目录中删除文件(如果使用——cached,则只删除索引),以便在下次提交时执行删除操作。

从索引中删除文件,或者从工作树和索引中删除文件。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