目录
2.1 git diff :比较工作树和暂存区,查看工作树中已暂存文件的变化,与是否提交至仓库无关。
2.2 git diff HEAD:比较工作树和仓库,查看工作树中已暂存文件和仓库的变化,与修改文件是否加入暂存区无关。
2.3 git diff --cached:比较暂存区和仓库,查看仓库文件在暂存区的变动。
1、背景分析
学习git肯定知道git 比较常用的三大区域:工作树、暂存区、仓库。(虽然名字有多种版本,但是大意相同)
(配图:网上随便找的)
而最先引起git关注的其实是暂存区,只有进入暂存区,git才会认识你,把你当做“自己人”。
2、git diff 如何比较三大区域的内容?
这里的比较不针对某个具体文件,只是大概念,对三个区域而言的比较。
正如上面1说讨论的,git diff 在不加参数的情况下,更多的关注的是暂存区(已暂存文件 tracked files)的变化。
注:下面内容的文件改变统一定义为:文件被修改,或被移动、或被删除。
(下面标题中的冒号‘:’,不是命令,仅仅是解释说明的作用。)
2.1 git diff :比较工作树和暂存区,查看工作树中已暂存文件的变化,与是否提交至仓库无关。
相当于: git diff working-tree(tracked files) index(teacked files)
情况分析:
(1)一个文件加入了暂存区,但是还没有提交到仓库,如果该文件改变了,git diff 就会显示文件的变化。
如下:黑色表示工作树文件、绿色表示暂存区。
按照分析,如果1中该文件发生改变(如下),git diff会显示变动。
(2)如果仅仅是工作树中未暂存文件(untracked files)的改变,git diff将没有任何显示。
像下面这样,git diff将没有任何显示。
2.2 git diff HEAD:比较工作树和仓库,查看工作树中已暂存文件和仓库的变化,与修改文件是否加入暂存区无关。
注:head指向最近一次的提交。
相当于: git diff working-tree(tracked files) commit(tracked files)
情况分析:
(1)一个文件已提交到仓库,如果该文件改变了,git diff head 就会显示文件的变化。
改变后还没有添加到暂存区,git diff head 就会显示文件的变化。
改变后,添加到暂存区,git diff head 还是会显示文件的变化。
(2)如果仅仅是工作树中未暂存文件的改变,git diff head 将没有任何显示。
2.3 git diff --cached:比较暂存区和仓库,查看仓库文件在暂存区的变动。
相当于: git diff index(teacked files) commit(tracked files)
情况分析:
一个文件已提交到仓库,如果该文件改变了,并且提交到暂存区时,git diff --cached 就会显示文件的变化。
如果改变后,还没有添加到暂存区,git diff --cached 将没有任何显示。
3、 比较某个文件的变化
如果明白了上面的内容,这个就很简单了!因为上面比较三大区域的变化是没有加入文件路径参数的,那么默认是所有文件的变动,如果针对某个文件而言,只需要指出该文件路径即可。
例如:git diff file.txt,查看已加入暂存区的文件file.txt,如果文件在工作树中改变,就会显示变动情况,如果没有改变就不显示。
如果该文件都没有添加到暂存区,那么这个命令就没有意义。
4、比较仓库之间的变化
提交后,就变成了仓库的历史版本,看名字就知道只是比较仓库,不存在暂存区和索引。
命令样式:git diff [<options>] <commit> ... <commit> [ - ] [<path> ...]
举例:git diff sha1 sha2 #比较哈希值为sha1 和哈希值为sha2的两个版本的仓库的区别。如果比较某个文件只需要在后面加入路径就可以了。
推荐阅读:官方文档:https://git-scm.com/docs/git-diff