git diff的对比对象的争议?实际代码测试+详细解释
1.git diff的对比对象的争议?实际代码测试+详细解释
(a)问题背景:我们在初步接触Git的使用教程时,都会接触到git diff这个命令,当我们在网络上百度git diff更多用法时,很多博客都复制贴贴般地介绍:“git diff:显示工作目录(working tree)与索引区(即暂存区快照,index,就是git add过的)之间的文件变更,即显示未被add的文件变更”。但是廖雪峰的Git教程的“工作区和暂存区”中提到“一旦提交后,暂存区就没有任何内容,修改被放入版本库”,这就产生了一个矛盾:“暂存区是空的时候,git diff实际对比是‘工作目录与最近一次提交’,而不是对比‘工作目录与暂存区’”。所以git diff到底是干嘛的?我们需要亲自探究一下!
(b)探究步骤:
(b-1)新建一个文件夹“gitDiff”,在里面新建1个txt文档,并写入内容(具体见以下图片)
(b-2)通过GitBash使用git init,git add -A,git commit –m “First Commit”命令第一次提交。该操作用于生成第一份commit提交过的版本,用于待会使用git diff用于对比
(b-3)现在修改一下1)中新建的txt文档“test.txt” (具体见以下图片)
(b-4)使用git diff命令,获得GitBash中的输出结果
结论1:这里git diff对比的是工作区中被修改的test.txt和仓库中最后一次提交的test.txt。因为工作区中被修改的test.txt并未被add,而且暂存区也是空的。
(b-5)使用git add test.txt命令,再使用git diff命令,获得GitBash中的输出结果
结论2:这里git diff对比的是工作区中被修改的test.txt和被add到暂存区的test.txt,因为被add后暂存区不再为空,所以不再对比仓库中的最后一次提交的了。但因为目前工作区和临时去的内容是一致的,所以上图git diff命令后GitBash没有任何输出。
(b-6)现在再修改一下txt文档“test.txt” (具体见以下图片)
(b-7)使用git diff命令,获得GitBash中的输出结果
结论3:这里git diff对比的是工作区中被修改的test.txt和被add到暂存区的test.txt,同时因为目前工作区和临时去的内容不再一致(因为步骤6进行了文本修改),所以上图git diff命令后GitBash产生了“两个不同文件的对比”的输出。
(c)总结:根据(b)探究步骤的测试与(b)中的3个结论,我们可以得出:
(c-1)当工作区有改动,临时区为空,diff的对比是“工作区与最后一次commit提交的仓库的共同文件”。
(c-2)当工作区有改动,临时区不为空,diff对比的是“工作区与暂存区的共同文件”。
git diff基础文章:git diff的最全最详细的4大主流用法
git diff进阶文章1:git diff 和 git diff –cached 和 git diff HEAD~X(X为正数)实际应用中的区别对比
本文参考来源:
[1] https://blog.****.net/clxjoseph/article/details/80213315
[2] https://www.cnblogs.com/oxspirt/p/5970101.html
[3] https://blog.****.net/AsheAndWine/article/details/78982919
[4] https://blog.****.net/whbing1471/article/details/52065448
[5] https://www.jianshu.com/p/bb97fabb475e
[6] https://blog.****.net/qq_37281252/article/details/79064638