在Git中,无论是删除文件还是变更文件名,对Git来说都是一种“改动”。
1. 直接删除
可以使用系统命令rm或资源管理器之类的工具来删除文件。例如:
$ rm welcome.html # 删除文件welcome.html
然后看一下状态:
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: welcome.html no changes added to commit (use "git add" and/or "git commit -a")
可以看到welcome.html文件当前的状态是deleted。如果确定这是你想做的,就可以把这次的“改动”加到暂存区:
$ git add welcome.html
再看一下当前的状态:
$ g$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: welcome.html
它现在的状态是deleted,而且已被加至暂存区,所以接下来就可以进行Commit了。如果“把删除文件加到暂存区”让你觉得不好理解,就把“删除文件”也当作一种“改动”就行了。
2. 请Git帮你删除
可以先执行rm命令删除,然后再执行git add命令加入暂存区的两段式动作,也可以直接使用git rm命令来完成:
$ git rm welcome.html rm 'welcome.html'
这时候查看状态会发现:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: welcome.html
它就直接在暂存区了,不需要再add一次,可以少做一个步骤。
使用SourceTree来完成也是很轻松的,只要在文件上右击,选择Remove选项,如图5-16所示。
图5-16
即可实现与执行git rm命令同样的效果。可以看到,welcome.html文件已被标记为删除且放置在暂存区,如图5-17所示。
图5-17
3. 加上--cached参数
不论是执行rm命令,还是执行git rm命令,都会真的把这个文件从工作目录中删除。如果不是真的想把这个文件删除,只是不想让这个文件再被Git控制了,可以加上-- cached参数:
$ git rm welcome --cached rm 'welcome.html'
这样就不会真的把文件删了,而只是把文件从Git中移除而已。这时的状态会变成:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: welcome.html Untracked files: (use "git add <file>..." to include in what will be committed) welcome.html
welcome.html的状态从原本已经在Git目录中的tracked变成Untracked了。
若使用SourceTree,则只需在文件上右击,选择Stop Tracking选项,如图5-18所示。
图5-18
这样就可以实现与执行git rm --cached命令同样的效果。可以看到,暂存区中出现了删除文件的标记,同时因为文件已变成Untracked状态,所以在文件前面有一个问号标记,如图5-19所示。
图5-19
1. 直接改名
与删除文件一样,变更文件名也是一种“改动”,所以在操作上也是差不多的:
$ mv hello.html world.html # 把hello.html改成world.html
这时候看一下状态,会看到两个状态的改变:
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working d irectory) deleted: hello.html Untracked files: (use "git add <file>..." to include in what will be committed) world.html no changes added to commit (use "git add" and/or "git commit -a")
虽然只是更改文件名,但对Git来说会被认为是两个动作,一个是删除hello.html文件,另一个是新增world.html文件(变成Untracked状态)。接着继续使用git add命令把这些异动加至暂存区:
$ git add --all $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: hello.html -> world.html
因为文件的内容没有改变,Git可以判断出这只是单纯地改名,所以现在它的状态变成renamed了。
2. 请Git帮你改名
与前面的git rm命令一样,Git也提供了类似的命令,可以让你少做一步:
$ git mv hello.html world.html
查看一下状态:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: hello.html -> world.html
其状态已变成renamed了。
如果使用SourceTree,同样是在文件上右击,选择Move选项,如图5-20所示。
图5-20
在弹出的对话框中输入要修改的文件名,如图5-21所示。
图5-21
完成后,会在前面标记一个R字样,如图5-22所示。
图5-22
Git是根据文件的“内容”来计算SHA-1的值,所以文件的名称不重要,重要的是文件的内容。当更改文件名时,Git并不会为此做出一个新的Blob对象,而只是指向原来的那个Blob对象。但因为文件名变了,所以Git会为此做出一个新的Tree对象。
如果不清楚这些Git对象是做什么用的,可参阅5.18节。