文件对比要对比什么?
在该节内容中,主要围绕以下2个核心进行差异对比操作.
- Git的主要分区可以分为
工作区
、暂存区
、本地仓库
、远程仓库
Git
实际上是一套内容寻址
文件系统,一切的提交实际都是对一个引用
- 如何对比两个区的差异?如何对比两个区中指定文件的差异?
- 如何对比两个引用节点的差异?如何对比两个引用节点中指定文件的差异?
差异对比
Git中进行差异对比的命令是
git diff
,其用法如下:git diff [options] [ [commitId-A(以该提交节点为基础,默认为工作区当前状况)] commitId-B(与基础节点做对比,为默认为HEAD)] [filePath]
关于--options
- 关于
--cached
- 若加上了该参数,那么Git的操作对象会从暂存区中获取
- 若不加该参数,那么Git的操作对象会从工作区中获取
- 关于
--stat
- 若加上了该参数,那么Git只会打印有差异的文件,而不会打印文件的具体差异信息
- 若不加该参数,那么Git的会打印文件的具体差异信息
- 关于
-w
- 加上
-w
参数,会忽略空白字符变更比较 - 不加上
-w
参数,对比操作会将空白字符的变更也记作为一个差异变更
- 加上
关于commitId
commitId
代表引用节点,可以是分支名、一个提交节点、Tag标签等commitId
若没有指定,则默认使用HEAD
commitId
若只指定了一个(commitId-B),则对比当前工作区(若指定了--cached参数
则默认为暂存区)与指定的节点(默认是HEAD)的差异commitId
若只指定了两个,则对比commitId-B相较于commitId-A
的差异,commitId-A默认为当前工作区(若指定了--cached参数
则默认为暂存区)与指定的节点commitId-B【默认为暂存区(若指定了--cached参数
则默认为HEAD节点
)】的差异
关于filePath
- 若没有指定
filePath
,则打印所有差异;若指定了filePath
则只打印指定文件的差异
工作区 VS 暂存区
- 操作对象的基础为:工作区 – 不需要加
--cached参数
- 对比对象为暂存区还没有所谓的提交节点 – 不指定
commitId-B
# 对比当前工作区与暂存区差别
$ git diff
# 对比当前工作区 index.php 与 暂存区 index.php 的差别
$ git diff index.php
工作区 VS 本地仓库/远程仓库
- 操作对象的基础为:工作区 – 不需要加
--cached参数
- 对比对象为仓库(已经有引用节点) – 指定
commitId-B
【值得留意:若没有指定filePath
而当前暂存区又没有任何操作对象,Git会自动切换为HEAD指针-本地仓库最后一次提交】
# 对比当前工作区与本地仓库差别
# 虽然:若暂存区没有任何暂存对象时,`commitId-B`会自动切换为HEAD,但建议若对比对象有提交点则自己手动输入HEAD/或提交节点
$ git diff HEAD
# 对比当前工作区 index.php 与本地仓库指定提交节点(commitB) index.php 的差别
$ git diff commitB index.php
注意:在对比有已经有应用节点的对象,若指定了filePath
,那么commitId-B是必须要指定的
暂存区 VS 本地仓库/远程仓库
- 操作对象的基础为:暂存区 – 需要加
--cached参数
- 对比对象为仓库(已经有引用节点) – 需要指定
commitId-B
# 对比当前暂存区与本地仓库/远程仓库差别
$ git diff --cached [HEAD/commitId-B]
# 对比当前工作区 index.php 与 暂存区 index.php 的差别
$ git diff --cached [HEAD/commitId-B] index.php
对比任意两个引用节点
- 操作对象的基础为:引用节点 – 不需要加
--cached参数
- 对比对象均为引用节点 – 需要指定两个
commitId
# 对比当前本地仓库与远程仓库最后一次提交的差别【假设在fast分支,远程仓库名为orgin】
$ git diff HEAD orgin/fast
# 对比 fast 分支与 master分支 的最后一次提交差别
$ git diff fast master
# 对比 commit-A 与 commit-B 两次提交的差别
$ git diff commit-A commit-B
扩展
- HEAD 当前分支的最后一次commit
- HEAD^ 当前分支的倒数第2次commit
- HEAD~n 当前分支的倒数第n次commit