Git中的diff命令可以显示文件之间的差异,同时-r选项可以遍历两个树对象,同时显示它们的差异。

从Git中的对象类型上看,一个树对象值只代表版本库中的一个目录层级,它包含该目录下的直接文件和它的所有直接子目录的信息,但不包括所有子目录的完整内容。而树对象引用所有子目录的树对象,所以对应项目根目录的树对象实际上代表某个时刻的整个项目,因此也可以说,git diff遍历两棵树。

git diff命令格式

存在三个可供树或类树对象使用git diff命令的基本来源:

  • 整个提交图中的任意树对象
  • 工作目录
  • 索引

通常情况下,git diff命令进行树的比较时可以通过提交名,分支名或标签名,同时,工作目录的文件和目录结构还有在索引中暂存文件的完整结构,都可以被看为树。

而git diff命令就可以使用上述三种来源的组合来进行如下4中基本比较:

  • git diff:比较工作目录和索引间的差异
  • git diff commit:比较工作目录和给定提交间的差异,常见的用法是HEAD
  • git diff --cached commit:比较索引中的变更和给定提交的变更的差异,如果省略commit,则默认为HEAD
  • git diff commit1 commit2:比较两个提交之间的差异,该比较会忽略工作目录和索引

命令行的参数个数决定使用哪种基本形式和比较什么。可以比较任意两个提交或树,比较的两个对象不需要有直接的或间接的父子关系。如果省略了一个或两个参数,那么git diff命令会比较默认的对象,比如工作目录,索引,HEAD等。

除了这几种基本形式的git diff命令外,还有一些比较有用的选项:

  • --M:该选项可以用来查找重命名并且生成一个简化的输出,只简单地记录文件重命名,如果文件不是纯的重命名,同时还有内容上的更改,那么Git会将它们调出
  • -w或--ignore-all-space:这两个选项会在比较时忽略空白字符
  • --stat:这个选项会显示针对两个树状态之间差异的统计数据,报告用简洁的语法显示有多少行发生了改变,有多少行添加了,有多少行删除了
  • --color:该选项会使输出结果使用多种颜色显示,一种颜色显示diff中的一种变化

git diff例子

首先在空目录下初始化版本库:

git init
echo abc > file1
git add file1
git commit -m "commit file1"
echo abcd > file2
git add file2
git commit -m "commit file2"

然后执行:

$ echo 1111 > file1$ git diff
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
diff --git a/file1 b/file1
index 8baef1b..5f2f16b 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-abc
+1111

文件file1在工作目录中已经修改,但是并没有暂存,因此可以直接使用git diff进行比较,此时比较的就是工作目录和索引的差异。

如果想要将工作目录与索引或版本库进行比较:

$ git diff --cached$ git diff HEAD
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
diff --git a/file1 b/file1
index 8baef1b..5f2f16b 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-abc
+1111

可以看出,索引和版本库是没有差异的,而工作目录和版本库是存在差异的,这里的差异打印和之前使用git diff的打印是相同的。

$ git add file1
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory$ echo 2222 > file1

此时再进行比较:

$ git diff
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
diff --git a/file1 b/file1
index 5f2f16b..c7dc989 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-1111
+2222$ git diff HEAD
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
diff --git a/file1 b/file1
index 8baef1b..c7dc989 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-abc
+2222$ git diff --cached
diff --git a/file1 b/file1
index 8baef1b..5f2f16b 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-abc
+1111

这里将file1暂存,同时在工作目录修改了file1的内容,这里的工作目录,索引,版本库的内容彼此之间都是不同的,因此会有上面的比较。

这里将file1提交:

$ git commit file1 -m "commit file1 again"
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
[master 3fc324d] commit file1 again1 file changed, 1 insertion(+), 1 deletion(-)$ git status
On branch master
nothing to commit, working tree clean$ cat file1
2222$ git diff HEAD HEAD^1
diff --git a/file1 b/file1
index c7dc989..8baef1b 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-2222
+abc

这里可以看出,提交之后HEAD和HEAD^存在差异。

git diff和提交范围

git命令支持两个点..来显示两个提交之间的差异,即以下两条命令是等同的:

git diff commit1..commit2git diff commit1 commit2

而在git log命令中,两点..是用来显示整个提交范围内的历史记录的,这是两者的差异之处。也可以看出:

  • git diff不关心比较的文件的历史,也不关心分支,即文件内容的差异
  • git log关心的则是文件的变动历史,即文件修改的历史

路径限制的git diff

通常情况下,git diff会基于从给定树对象的根开始的整个目录结构。然而,可以使用和git log中相同的路径限制来限制git diff只输出版本库的一个子集。

$ echo 1111 > file1$ echo 2222 > file2$ git diff
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in file2.
The file will have its original line endings in your working directory
diff --git a/file1 b/file1
index 8baef1b..5f2f16b 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-abc
+1111
diff --git a/file2 b/file2
index acbe86c..c7dc989 100644
--- a/file2
+++ b/file2
@@ -1 +1 @@
-abcd
+2222$ git diff file1
warning: LF will be replaced by CRLF in file1.
The file will have its original line endings in your working directory
diff --git a/file1 b/file1
index 8baef1b..5f2f16b 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-abc
+1111

比如上面的例子,如果同时修改了file1,file2,而在当前状态下只需要考虑file1的提交,那么就可以使用git diff file1来限制比较的对象只为file1。

Git版本控制管理——diff相关推荐

  1. 《Git版本控制管理(第2版)》——4.3 Git在工作时的概念

    本节书摘来自异步社区<Git版本控制管理(第2版)>一书中的第4章,第4.3节,作者:[美]Jon Loeliger , Matthew McCullough著,更多章节内容可以访问云栖社 ...

  2. 【Git版本控制管理】Gitee(码云)和GitHub的使用

    远程仓库的使用 文章目录 远程仓库的使用 使用码云(Gitee) 使用GitHub 远程仓库是指托管在因特网或其他网络中的你的项目的版本库. 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读 ...

  3. java中git版本控制,git版本控制管理是什么?git如何实现版本控制?

    大家好,今天要跟大家讲的是关于git版本控制管理的一点小知识,git相信程序员小伙伴们都已经很熟悉了,很多项目开发都需要git,所以,git版本控制管理到底是干嘛的呢?Git又如何实现版本控制呢?下面 ...

  4. Git 版本控制管理(一)

    Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git  -- The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...

  5. Git版本控制管理——简介

    说明 在大型项目开发或者多人协作开发时,都希望可以对软件代码进行管理和追踪,以便确认开发的进度和方便问题追溯.这就需要使用到版本控制系统(VCS),比如Git就是一款很优秀的版本控制工具.如今很多项目 ...

  6. Git版本控制管理——远程版本库

    之前提到的Git的所有操作都是在本地完成的,而实际项目开发并不是一个人就可以搞定的,通常需要团队的协作,而这些协作可能又不是在同一个地区的,这就涉及到Git的分布式特性了. Git的分布式特定会涉及到 ...

  7. Git版本控制管理(二)--git配置

    在系统上安装好 Git后,还需要配置Git 环境. 每台计算机上只需要配置一次,程序升级时会保留配置信息,也可以在任何时候再次通过运行命令来修改它们. 配置文件位置 Git 自带一个 git conf ...

  8. Git版本控制管理——提交

    在Git中,提交是用来记录版本库的变更的. 当提交时,Git会记录索引的快照并将快照放进对象库,该快照不包含该索引中任何文件或记录中的副本.Git会将当前索引的状态与之前的快照做一个比较,并派生出一个 ...

  9. 3.git版本控制-管理修改、撤销、删除

    管理修改 第一次修改 -> git add -> 第二次修改 -> git commit,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交, ...

最新文章

  1. EXCEL基础篇(二)
  2. Verilog初级教程(14)Verilog中的赋值语句
  3. python数据库抓取并保存_python:微信消息抓取、转发和数据库存储及源码
  4. 大数据创业难度大 五个值得关注的重点
  5. 视频云下半场 向前走还是向“厚”走?
  6. [HAOI2007]理想的正方形
  7. ASP.NET : Kerberos网络认证过程
  8. daz模型导入marvelous_传世工坊自制Daz Studio 4.10 系列入门教程
  9. 三维视觉前沿进展年度报告
  10. CSS3---2D/3D应用
  11. 不花钱、不买服务器可以搭建个人博客吗?快进来,给你安排!
  12. 特斯拉明年会有100万辆自动驾驶出租车 你敢坐吗?
  13. vue 插件 滑块验证_Vue插件之滑动验证码
  14. Vue、 React比较
  15. 传奇修改map地图教程_传奇地图Objects.wil与map文件的对应关系
  16. 基于中间件的开发---中间件技术
  17. 飞控算法-姿态解算之互补滤波
  18. 高德地图 调用天地图 WMTS 服务
  19. 有哪些值得推荐的计算机专业的竞赛?
  20. iVMS-4200 Vs区别_理科与工科有什么区别?如何判断自己适合学那个?

热门文章

  1. [ 网络 ] 应用层协议 —— HTTP协议
  2. 机器学习SVM——实验报告
  3. MySql数据库之视图(定义视图、查询视图、更新视图、视图的作用)
  4. Cadence Orcad Capture创建多部分Symbol及Homogeneous及Heterogeneous图文教程及视频演示
  5. Windows驱动_WDDM之二
  6. tplink控制上网设备_TP-LINK无线路由器怎么设置限制别人wifi网速
  7. WebRtc以Trickle ICE形式去进行pair
  8. 程序员年薪20万、30万、40万都是什么样的体验?
  9. (十八)自动装配-@Autowired-构造器,参数,方法,属性
  10. 接口测试平台代码实现86: 全局请求头-1