Git学习篇之git diff用法详解


一、git diff 和 git diff HEAD – < file> 用法介绍

首先明确:git相较于其他版本控制系统的优越性,在于管理和跟踪的是修改,而不是文件。我们引入 git diff 来说明。
下面是工作区和暂存区的工作示意图
工作区:即用户桌面上的可见可操作目录。
版本库 = 暂存区(stage) + 分支区(master)

在这里插入图片描述

1.git diff 用法:
git diff 中 diff 即 different 的意思,表示在 git 中查看修改的状态。
此时要注意的是:两种情况,那么对应的git diff 结果则表示不同的含义。
(1)当暂存区(stage)不为空,表示工作区和当前暂存区内容变化的区别。
(2)当暂存区(stage)为空,表示工作区和最新版本库的内容变化区别。
2.git diff HEAD – < file >用法:
表示工作区和当前版本库的内容变化区别。HEAD表示分支区master中的指针指向,file表示的是工作区内的文件。

二、具体用法比较:上图说明

步骤1.在Notepad++中,编辑文件readme.txt,demo1。

Alt

步骤2.输入 cat 命令,查看文本内容,并通过get add 命令,把文件修改添加到暂存区(stage)。Alt
步骤3.修改文本内容为demo2后,输入 cat 命令查看文本。AltAlt
重点来啦!!!此时,我们已经完成的内容有:
1. 在工作区: 编辑demo1文本 ——> 2. 输入git add 命令,此时demo1已被添加到暂存区 ——> 3. 在工作区:修改demo1为demo2 ,demo2未被添加到暂存区。
输入 git diff 如图:

Alt

+ 代表工作区中的新增变化内容,- 代表版本库内的新增变化内容。(可以理解为显示两者内容的区别)
原因解释:此时的暂存区中不为空(git diff 第一种情况),存在第2步中被 add 命令添加的 demo1。因此diff 此时比较的是工作区和暂存区的新增变化内容。 工作区此时新增修改demo2,而暂存区新增demo1。
输入 git diff HEAD 如图:

在这里插入图片描述

输入 git diff HEAD – < file >如图:

Alt

原因解释: git diff HEAD – < file >表示工作区和当前版本库的内容变化区别。HEAD表示分支区master中的指针指向,file表示的是工作区内的文件。
图中相比于git diff 没有出现的demo1而是出现了tracks changes of files,表示此时版本库内已接收了工作区的修改,即git add 操作,但是由于没有 commit 上传操作,stage区添加的文件无法传递到分支区,因此HEAD指针无法具体指向。所以,对于版本库来说,只能接收到有文件修改但是无法具体指明。
我们都知道,把文件添加到版本库分两步, 1、git add 添加到暂存区 2、git commit --m < message > 上传到分支区。
步骤4.输入 git commit 命令,上传demo1。Alt
输入git diff 和 git diff HEAD 查看变化:
此时,在工作区中:仍有demo2, 而在版本库中,暂存区中的文件被上传到分支区中,而暂存区目前已为空,这个后面会讲为什么是空?

Alt

+ 代表工作区中的新增变化内容,- 代表版本库内的新增变化内容。(可以理解为显示两者内容的区别)
原因解释:输入 git diff (此时是git diff 的第二种情况) ,从结果上看, 此时的结果不再是 tracks changes of files而是 工作区中存在demo2。
这是因为,版本库中此时存在demo1,因为暂存区此时为空, 通过git commit 操作已将修改提交到了分支区中,而此时的diff 比较的是工作区和版本库的最新内容变化,因此demo1可在版本库中的分支区找到。
原因解释: 输入git diff HEAD – < file >表示工作区和当前版本库的最新内容的变化。HEAD表示分支区master中的指针指向,此时指向了demo1,而file表示的是工作区内的文件,此时存在demo2。
这便可以解释,为什么当暂存区为空时,diff 和 diff HEAD的结果一样。
步骤5.完成以上操作后,现在的情况是:
在工作区中,存在demo2(来自demo1 的修改);
在暂存区中,无;
在分支区中,diff 和 diff HEAD指向demo1。
6.我们此时来看看,为什么git commit操作后,暂存区中就为空。(反证法:假设git add 后,暂存区不为空)
输入git add,重新将工作区中的demo2修改添加到暂存区。
输入git diff 和 git diff HEAD 查看结果。Alt
我们看到的是,此时输入git diff 我们发现结果无显示,,而输入git diff HEAD后,结果与为进行 add 添加操作前一样!版本库中存在demo1。
那么我们是不是可以这样理解,如果说经过git add demo2 后,此时的暂存区中仍保存着之前 git add 操作的demo1, 那么git diff 应该不为空,(也就是diff的第一种情况),那么此时比较的是工作区和暂存区的内容变化。
在上一条成立的条件下,然后,我们再看git diff HEAD 后的结果。git diff HEAD按道理比较的是工作区和版本库最新内容的变化,那么此时上一步的 git add 操作已经将工作区中的demo2 添加到了暂存区,那么输入 diff HEAD结果应该同步骤1中的diff HEAD,出现tracks changes of files ,而不是版本库中存在demo1。

结论:因此,我们得知,在进行git add操作后,工作区中的修改被添加到了暂存区,而随着git commit 操作的进行,暂存区的内容被一次性上传到了分支区中,暂存区此时为空!!!

7.输入 git commit 命令,将demo2上传至分支区。来验证以上结论。

Alt

此时,由于暂存区的demo2 通过 git commit 命令上传至分支区,此时暂存区为空, 输入git diff 和 git diff HEAD结果一样, 都表示工作区和版本库最新内容变化!

结尾:对git diff 和 git diff HEAD 的用法就说到这里,理解的关键,还是要通过测试,有不对的地方还请大家多多评论指正!

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐