购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.5 如何在Git中删除文件或变更文件名

在Git中,无论是删除文件还是变更文件名,对Git来说都是一种“改动”。

5.5.1 删除文件

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

5.5.2 变更文件名

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

5.5.3 文件的名称不重要

Git是根据文件的“内容”来计算SHA-1的值,所以文件的名称不重要,重要的是文件的内容。当更改文件名时,Git并不会为此做出一个新的Blob对象,而只是指向原来的那个Blob对象。但因为文件名变了,所以Git会为此做出一个新的Tree对象。

如果不清楚这些Git对象是做什么用的,可参阅5.18节。 ZcAKWGqy8CI+mQ4ZRBAGhliiO2j/PYmut6f0Gx6psulPyZNALR+GrkIDkvT6r2sN

点击中间区域
呼出菜单
上一章
目录
下一章
×