弄清楚几个命令区别之前,得弄明白git工作原理,这里以一个文件(这里新增为例),没有使用git add 到'缓冲区'之前,文件是指在工作区内的一个untracked的文件
此时文件只在工作区,使用git diff 没有意义,因为文件在只存在缓冲区,没有比较对象。
图(1)
使用git add 把文件添加到缓冲区后,此时state里面内容为:
此时index(缓冲区)里面内容和工作区文件内容一模一样,通过git diff 没有任何输入
图(2)
如果此时使用git diff --cached 命令则会有输出,如下图:
比较对象的一个区域还是空值,还没有内容,那这个为空值的区域就是版本库的区域了
图(3)
,说明 git diff --cached 肯定拿(工作区或暂存区)和版本库(commit)进行了对比。
下面我们修改下工作区中的文件,不提交,在进行下对比。

图(4)
应为文件一直没有commit,所有,现在结果只能是工作区的文件和暂存区(index)的文件对比结果:
也就是说,git diff 是比较的工作区文件内容和暂存区文件内容的差别~
此时在运行git diff --cached 命令得到如下结果:图(5)
此时的输出,结合图3上结果,可以得出结论:
图(5)
git diff --cached 比较的是,版本区域(commit提交)和index(暂存区)的内容
我们在commit之前在执行下,git diff HEAD ,结果如下:(图六)

说明git diff HEAD 比较的是comimt区域和工作区域内容差别!
总结一下:
git diff:是查看working tree与index file的差别的。
git diff --cached:是查看index file与commit的差别的。
git diff HEAD:是查看working tree和commit的差别的。(你一定没有忘记,HEAD代表的是最近的一次commit的信息)
这里在普及下,git ‘工作区,暂存区,和commit的知识: