git diff,git diff --cache和git diff HEAD 区别

弄清楚几个命令区别之前,得弄明白git工作原理,这里以一个文件(这里新增为例),没有使用git add 到'缓冲区'之前,文件是指在工作区内的一个untracked的文件

attachments-2016-06-EhpHO1u7576552bb323a此时文件只在工作区,使用git diff 没有意义,因为文件在只存在缓冲区,没有比较对象。

                     图(1)

使用git add 把文件添加到缓冲区后,此时state里面内容为:

attachments-2016-06-dt69yHYH576553975678此时index(缓冲区)里面内容和工作区文件内容一模一样,通过git diff 没有任何输入

                    图(2)

如果此时使用git diff --cached 命令则会有输出,如下图:

attachments-2016-06-ft4wO112576554653679比较对象的一个区域还是空值,还没有内容,那这个为空值的区域就是版本库的区域了

           图(3)

,说明 git diff --cached 肯定拿(工作区或暂存区)和版本库(commit)进行了对比。

下面我们修改下工作区中的文件,不提交,在进行下对比。

attachments-2016-06-eUQZrWm95765563a23af

          图(4)

应为文件一直没有commit,所有,现在结果只能是工作区的文件和暂存区(index)的文件对比结果:

也就是说,git diff 是比较的工作区文件内容和暂存区文件内容的差别~

此时在运行git diff --cached 命令得到如下结果:图(5)

attachments-2016-06-fr9uvDyd576558fc7fd6 此时的输出,结合图3上结果,可以得出结论:

       图(5)

git diff --cached 比较的是,版本区域(commit提交)和index(暂存区)的内容


我们在commit之前在执行下,git diff HEAD ,结果如下:(图六)

attachments-2016-06-5NsUBm2H57655a50072c


说明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的知识:


  • working tree:就是你所工作在的目录,每当你在代码中进行了修改,working tree的状态就改变了。
    index file:是索引文件,它是连接working tree和commit的桥梁,每当我们使用git-add命令来登记后,
  • index file的内容就改变了,此时index file就和working tree同步了。
    commit:是最后的阶段,只有commit了,我们的代码才真正进入了git仓库。我们使用git-commit就是将index file
  • 里的内容提交到commit中。











请先 登录 后评论
  • 0 关注
  • 0 收藏,1078 浏览
  • 石天 提出于 2016-06-18 21:58