第五章:文件管理与索引
1】Git会在工作目录和版本库之间加设一层索引,用来暂存(stage)、收藏或者修改。
2】在工作目录下编辑,在索引中积累修改,然后把索引中积累的修改作为一次性变更进行提交。
3】Git的索引就是一组预期的修改,只有提交后才会在版本库中实现变更。
4】除了移动和删除文件,其他的暂存和提交可以合成一步完成。
1、关于索引的一切
1】Git 索引不包含任何文件内容,它仅仅追踪想要提交的的那些内容。
git commit 命令,Git通过索引找到而不是工作目录找提交的内容。
2】Git的 "porcelain" (高层)命令对你隐藏的索引的细节,但也了解索引和它的状态。
3】git status命令可以查看索引的状态, git ls-file : 底层命令,查看Git的内部状态。
4】git diff命令查看,仍留在工作目录中且未暂存的变更。 git diff --cached显示已经暂存的变更。
2、Git中的文件分类
1】Git将文件分为3类: 已追踪、被忽略的以及未追踪的。
2】编辑器和构建环境会在源码周围遗留一些临时文件。这些文件应该被忽略。
` a】在根目录下创建 .gitignore文件(不带后缀),在文件里添加忽略文件的名称。
3、使用git add
1】git add命令,暂存文件,同时将未追踪文件转化成已追踪文件。
2】git add 目录名。 暂存该目录下的所有文件。
3】git hash-object file命令,直接计算当前目录中的文件的SHA1值。
4】文件存储在对象库中,索引只是指向它而已。
5】git add 或者 commit 命令, --interactive选项 + 路径。操作路径下的文件进行暂存或者提交。
4、使用git commit 的一些注意事项
1】git commit -a 命令会自动暂存所有已知的修改的文件。新文件除外(索引中没有的)
2】不通过命令行直接提供日志消息,Git会启动编辑器
5、使用git rm
1】git rm命令会在版本库和工作目录中同时删除文件.
2】删除文件比添加文件问题要多,Git对移除文件更多关注。
3】Git 可以从索引或者同时从索引和工作目录中删除文件,但不会只从工作目录中删除文件。
4】git rm 是对索引进行操作的命令,所以这个命令对没有添加到版本库或索引中的文件无效。
5】git rm --cached会删除索引中的文件,工作目录中还在。 git rm 命令将文件从索引和工作目录都删除。
6】Git删除文件前,会先进行检查:工作目录下该文件的版本与当前分支中的最新版本一致。
7】git checkout --file : 用版本库或者暂存区里的版本替换工作区的版本。
6、使用git mv
1】Git会在索引中删除stuff路径名,并添加newstuff的路径名。
stuff的原始内容仍保存在对象库中,将对象库中的内容与newstuff重新关联。
2】git log newfile 查看修改过名字的文件,只能查看到新名字文件的历史记录。
查看文件的全部历史记录添加 --follow选项。
7、追踪重命名注解
1】SVN对文件重命名和移动做了很多追踪工作。因为它只追踪文件之间的差异。
2】SVN只是做重命名,也需要再次传输和存储文件的全部内容。
3】SVN显式的追踪每一次重命名,缓解上面的情况。注意: mv有效。 rm + add不会显式。
4】Git不追踪重命名,文件的移动只会影响树对象。
8、.gitignore文件
1】将要忽略的文件的路径写入 .gitignore文件内,就能忽略该文件。
2】Git支持丰富的忽略写法。
如何解决,之忽略根目录下的 1.txt文件而不忽略1/1.txt文件
3】Git允许每一个目录下都有 .gitignore文件,每个文件都只影响该目录及其子目录。
4】.gitignore文件的规则是级联的。可覆盖高层规则。
5】Git对忽略文件设置的优先顺序: 从高到低。
6】当忽略文件适用于所有版本库时,才会写入.gitignore文件内。
7】当忽略文件只适用于自己的版本库时,要写入 .git/info/exclude文件内。
8】.gitignore只能忽略没有被track(追踪)的文件,已经纳入版本管理中的文件,修改.gitignore是无效的。
9、Git中对象模型和文件的详细视图
1】从工作目录、索引、版本库三个角度理解Git操作。
2】图1, 工作目录包含两个文件,内容分别是"foo" 和 "bar"。
(图 1)
3】图2、工作目录中修改file1内容"foo"为 "quux"。工作目录是脏的(脏:是指工作目录和版本库不同)
(图 2)
4】图3、file1在工作目录修改后,进行 git add file1操作。
(图 3)
5】图4、 git add file1操作后,进行git commit 操作。发生的变化。
(图 4)