一、简介
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文件的内容:
证明了,上面的比较是正确的。
若您感觉本站文章不错,读后有收获,不妨赞助一下?
我要赞助