大家都知道,.gitignore 文件可以让 Git 选择性地忽略一些文件,目的是不想让这些文件上传到远端。但是,这常常让人担心,一些测试用文件是常驻于本地的,而本地的开发常常需要切换分支。如果忽略这些文件,是不是切换分支时它们会“消失”呢?答案是否定的。这就要说到 Git 是怎么追踪文件和切换分支的。
首先是追踪文件,Git 只会追踪被“添加”的文件,也就是执行 git add filename 后 filename 才会被追踪。因此,.gitignore 中列出的文件实际上跟没有被添加到列表的文件是同等对待的。因此,Git 不会操作这些文件(理论上),即便是 git reset --hard 也拿它们没有办法。但是,一旦文件被添加到列表,Git 将会对该文件进行操作,虽然切换分支暂时不会对新添加的文件“动手”,但是一旦有 commit 过的文件被修改,且未 commit 的状态下进行分支切换,最好的情况是自动合并了,最坏的情况是产生冲突需要手动处理;而 git reset --hard 会将未提交的文件全部重置,导致所有修改丢失。因此,才会有人觉得切换分支会导致丢失文件,那其实是操作问题。因此,我们想要切换分支不影响某些测试用文件,大可以把它们添加到 .gitignore 中,而且这些文件是不会 push 到远程仓库的。
再简单说说切换分支,其实切换分支的操作就是将文件覆盖回分支的版本,而不是把工作区清空以后再放回文件,这跟换硬盘之类的操作是有本质区别的。前面也说过,Git 只会操作被追踪的文件,不在列表中的文件是不会被追踪的。因此,切换分支理论上不会让 .gitignore 中的文件丢失,除非操作有问题。
当然了,如果某些文件在之前的版本被提交,而后再被加入到 .gitignore 中,我就不确定会不会被覆盖了,按原理来说很大可能会被 reset 动作覆盖,所以一些文件应该一开始就加入到 .gitignore 中,以免出现问题。