关于文件删除,我们分两种情况,第一种是已经被Git追踪的文件,也就是暂存区中已经存在的文件,第二种是未被Git追踪的也就是暂存区中没有的文件。
针对第一种情况,我们使用git rm 文件名 删除,那么大家可能会问这个命令它做了一件什么事情呢,跟直接 rm 有什么区别。我们知道,工作区修改和添加文件之后,使用git add命令会把这些操作添加到暂存区中,然而git add添加的并不包含删除操作,所以有git rm这个命令,这个命令其实就是干了两件事情,第一件事就是跟rm一样的事情,删除文件,第二件事情就是将这个删除操作记录到暂存区,执行后,暂存区的那个文件也被删掉了。
那么如果已经被追踪的文件不小心用rm删除了,怎么办呢?
可以commit的时候加-a参数(-a 参数表示,可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区)
git commit -a -m 'delete file'也可以再用git rm --cache 文件名删掉暂存区的内容(不加--cache也可以)
➜  learngit git:(master) touch test.txt
➜  learngit git:(master) ✗ git add test.txt
➜  learngit git:(master) ✗ rm test.txt
➜  learngit git:(master) ✗ git rm test.txt
rm 'test.txt'
➜  learngit git:(master) git status
On branch master
nothing to commit, working tree clean针对第二种情况,其实也就是从来没有 git add 更没有 git commit 的 文件,那么直接用 rm 系统命令删除就好了,如果使用git rm反而会报错:
➜  learngit git:(master) touch test.txt
➜  learngit git:(master) ✗ git rm test.txt
fatal: pathspec 'test.txt' did not match any files因为他在暂存区根本找不到这个文件,所以报错了。
上面提到了
git commit的-a参数,仔细读说明可以发现,使用对象是已经追踪的文件,所以注意,如果你有新的文件(未被追踪,也就是没有git add过),是无法通过这个参数一起提交的,所以千万不要以为使用git commit -am这个命令就连git add都可以省掉,一步搞定,万事大吉!有新文件的话,还是老老实实的先git add再git commit吧。
git rm有个--cache,是这样说的:
--cached
           Use this option to unstage and remove paths only from the index. Working tree files, whether
           modified or not, will be left alone.这个命令是删掉暂存区的东西,不会影响工作目录。
使用.gitignore去忽略一些文件的时候可能大家会遇到这种情况:文件以及被追踪了,甚至早都提交了,突然想忽略掉这个文件了。
然后,大家兴致勃勃的修改了.gitignore文件,然后提交了,以为万事大吉了。其实不然,暂存区和当前分支还都有这个文件,我们只有从暂存区删掉这个文件,并且连同修改后的.gitignore一起提交才可以。这就用到上面提到的--cache参数了,因为我们希望的是只删除暂存区的那个文件,而非连工作目录的一起删掉。所以这时候我们需要执行:
git rm --cache 文件名
git add .gitignore
git commit -m 'ignore file'本节我们主要讲的是git rm的用法,并且提到了几个场景。我们可以知道这个命令主要是操作暂存区的,处理 git add 不能添加到暂存区的删除操作。