比较工作区暂存区本地仓库差异
访问量:3403

一、简介

git diff命令主要是用来里面查看git里面的工作区、暂存区、本地仓库之间差异。使用方法如下图:

同时,git diff还可以用来比较两个commit直接的区别,如下:

git diff commitId1 commitId2

二、参数

参数说明
-- file1 file2
限制,只比较file1和file2两个文件的差异
--stat仅仅显示哪些文件被改动(删了多少行、新增多少行),如“1 file changed, 2 insertions(+), 1 deletion(-)”

备注:

HEAD   最近一次 commit

HEAD^   上次提交

HEAD~100   上100次提交

三、实例

1.如何比较工作区和暂存区的不同

首先,我们查看一下工作区文件如下:

-rwxr-xr-x. 1 dequan test 4 Jan 27 01:53 index.html

可以看出,文件权限755,文件内容:

此时,执行如下命令查看暂存区内容:

 git ls-files --stage

可以看出,暂存区的文件如下:

100644 4ec5a94f66f04df53258a962f0b6f4ba5c379025 0	index.html

可以看出文件权限是644,文件内容如下:

我们通过人工对比发现,工作区和暂存区,不仅仅文件权限不一样,文件内容也是不一样的。接下来,我们使用git  diff 来查看一下:

git diff显示结果解析如下:

第一行“diff --git a/index.html b/index.html” ,代表的是对git里面的命令,进行可视化显示。其中“a/index.html”和“b/index.html ”分别代表的是暂存区和工作区中的index.html文件。

第二行 “index 4ec5a94..dfcd423 100644”,代表两个版本的git哈希值(暂存区的index.html文件对应的哈希值4ec5a94,与工作区index.html文件对应的哈希值dfcd423,若将工作区index.html文件添加到暂存区,暂存区index.html文件对应的哈希值将变为dfcd423)。100644代表在暂存区里面当前文件类型和权限100代表regular file,644代表权限是:拥有者(读+写),所属组(读),其他人(读)

第三行“--- a/index.html”其中, "---" 表示变动前的文件,可以理解成暂存区里面的index.html文件。

第四行“+++ b/index.html”其中,"+++"  表示变动后的文件,可以理解成工作区里面的index.html文件,。

第五行,"@@ -1 +1,2 @@" 代表差异的定位语句,减号后是原文件(暂存区里index.html的文件)的开始行号和行数(若只有一行,就不显示行数)。加号后是新文件(工作区里面的index.html文件)的开始行号和行数。上图里面的意思表示原文件从第一行开始,只有一行。新文件从第一行开始,共二行

第六行到第八行,代表的是文件内容,关于文件内容内容的每一行最前面,会有一个标记位,标识位含义如下:

如果为空,表示该行无变化

如果是感叹号(!),表示该行有改动

如果是减号(-),表示该行被删除

如果是加号(+),表示该行为新增

所以:

“-hll”代表该行被删除了。

“+hll001”代表该行是新增的。

“+just for test”代表该行是新增的。

2.比如比较两次提交中的index.html文件的差异

如下图,我想比较标注出来的两次提交中,index.html文件的差异,如下图:

可以使用如下命令:

git diff 309453 665ed5 -- index.html

备注:因为commitId比较长,一般使用前6位就可以了。

当然,我们也可以通过git cat-file命令验证上面的结果是否正确:

首先,来查看一下,commitId为309453的对应的内容,如下:

可以看出,commitId为309453对应的tree为4b825d,现在我们可以看看这个tree里面的内容:

可以看出,是空的。说明commitId为309453里面不存在index.html文件。

然后,再来查看一下,commitId为665ed5的对应的内容,如下:

可以看出,commitId为665ed5对应的tree为d89521,现在我们可以看看这个tree里面的内容:

然后,我们在看一下index.html文件的内容:

证明了,上面的比较是正确的。