在上面一节中,我们学习了通过git status命令查看文件修改列表,但很多时候并不能满足需求,比如说,我想看某一个文件具体修改了什么内容。
6.1 名词定义
在学习 Git 的diff命令之前,我们先来统一 一下两个名词的理解,分别是工作区和暂存区。
6.1.1 工作区
工作区,指的是当前正在编辑的文件,将还没有修改的内容通过git add命令暂存起来;比如我现在修改了index.php文件中的一行代码,没有执行git add index.php命令,那么 index.php 便处于工作区状态。
6.1.2 暂存区
暂存区,指的是文件修改之后并且通过git add命令临时存储到版本记录里了,但还没有正式通过git commit提交的阶段;比如我现在新增一个test.php文件,使用了git add test.php命令,那么此时, test.php 文件的改动就已经进入到了暂存区。
6.2 比较工作区变动
现在我编辑了index.php文件,并且在里面加入了内容,如果我想通过 git 命令查看增加了哪些内容,参考命令如下
git diff
执行命令之后,绿色部分代表增加的内容,红色部分代表删除的内容,执行结果如下图所示:
在图中可以看到我在 index.php 中增加了zhangsan。
6.3 比较暂存区变动
有些时候,我们可能已经通过git add命令,将某些文件从工作区添加到暂存区,但又想回过头,来看此文件刚才改动哪些内容的场景;比如下图中是我刚才新建了一个diff.php文件,并且已经添加到暂存区,如下图执行了git status命令结果所示:
但我突然发现,我已经忘记这个文件里到底有哪些内容被改变了,于是我使用了git diff diff.php命令查看变动的内容,执行结果如下图所示:
在 Git 的返回信息中却无法看到修改详情,原因是因为 diff.php 文件被提交到暂存区之后,工作区并没有再次改动,此时工作区与暂存区一致,当然就不能看出改动情况了。
这个时候,如果想要看diff.php文件里面修改了什么内容,就不是再把工作区和暂存区进行对比了,而是需要把暂存区与版本库最近一次 commit 的内容进行比较,参考命令如下:
git diff --cached diff.php
命令执行结果如下图所示
在图中可以看出,diff.php 中新增了一行代码,内容为lisi 。
6.4 与指定记录比较
有些时候,我们可能需要代码和历史的某一个版本进行比较,这个时候你可以先通过git log命令,找到历史提交记录的一个 hash 值,如下图所示:
6.4.1 工作区比较
将要比较的 hash 值复制下来,然后执行如下所示命令:
git diff hash值

6.4.2 暂存区比较
有些时候,我们想把暂存区的改动和指定记录进行对比,那么在命令中加入--cached 即可,参考命令如下:
git diff --cached hash值
执行结果如下图所示:
从图中可以看到 diff.php 文件,在指定的版本还未存在,在当前的暂存区中被添加了进来,新增的内容有一行,内容是lisi。
6.5 与最新版本库比较
很多时候,我们只需要将未正式提交的代码(包含工作区与暂存区)与最新的 commit 记录进行比较,虽然也可以通过指定 commit 的 hash 值进行,但是却很不方便,需要先获取到 hash 值,这里介绍一个简单的方法,可以通过git diff HEAD命令方式快速对比,参考命令如下:
git diff HEAD
执行命令返回结果如下:
在执行的命令中,HEAD指的是当前所在的分支名,如果你想比较其他分支也可以将 HEAD 改成其他分支名。
6.6 比较两个历史记录
有时候,可能会需要查看某一次提交记录修改了什么内容,这个时候就需要将两个历史记录进行比较;首先通过git log命令获取到需要查看的记录 hash 值,然后再找到这个记录的上一个版本的 hash 值,拼接的参考命令如下所示:
git diff hash值1 hash值2
命令执行之后,显示的效果如下:
6.7 小结
在这节内容中,主要介绍了工作区和暂存区的概念,以及如何使用 diff 命令进行比较差异,主要知识点有以下:
- 工作区,是指目前改动的内容还未使用
git add临时存储 - 暂存区,是指改动的内容已经临时存储,还未正式通过
git commit提交 - 比较修改的命令为
git diff,不同情况增加不同参数 - 查看暂存区的额外参数为
--cached - 比较历史差异输入一个 hash 值,则是把当前的改动和历史差异对比,两个 hash 值则是把前一个版本和后面一个版本进行对比







