Git版本控制管理——diff
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相关推荐
- 《Git版本控制管理(第2版)》——4.3 Git在工作时的概念
本节书摘来自异步社区<Git版本控制管理(第2版)>一书中的第4章,第4.3节,作者:[美]Jon Loeliger , Matthew McCullough著,更多章节内容可以访问云栖社 ...
- 【Git版本控制管理】Gitee(码云)和GitHub的使用
远程仓库的使用 文章目录 远程仓库的使用 使用码云(Gitee) 使用GitHub 远程仓库是指托管在因特网或其他网络中的你的项目的版本库. 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读 ...
- java中git版本控制,git版本控制管理是什么?git如何实现版本控制?
大家好,今天要跟大家讲的是关于git版本控制管理的一点小知识,git相信程序员小伙伴们都已经很熟悉了,很多项目开发都需要git,所以,git版本控制管理到底是干嘛的呢?Git又如何实现版本控制呢?下面 ...
- Git 版本控制管理(一)
Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git -- The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...
- Git版本控制管理——简介
说明 在大型项目开发或者多人协作开发时,都希望可以对软件代码进行管理和追踪,以便确认开发的进度和方便问题追溯.这就需要使用到版本控制系统(VCS),比如Git就是一款很优秀的版本控制工具.如今很多项目 ...
- Git版本控制管理——远程版本库
之前提到的Git的所有操作都是在本地完成的,而实际项目开发并不是一个人就可以搞定的,通常需要团队的协作,而这些协作可能又不是在同一个地区的,这就涉及到Git的分布式特性了. Git的分布式特定会涉及到 ...
- Git版本控制管理(二)--git配置
在系统上安装好 Git后,还需要配置Git 环境. 每台计算机上只需要配置一次,程序升级时会保留配置信息,也可以在任何时候再次通过运行命令来修改它们. 配置文件位置 Git 自带一个 git conf ...
- Git版本控制管理——提交
在Git中,提交是用来记录版本库的变更的. 当提交时,Git会记录索引的快照并将快照放进对象库,该快照不包含该索引中任何文件或记录中的副本.Git会将当前索引的状态与之前的快照做一个比较,并派生出一个 ...
- 3.git版本控制-管理修改、撤销、删除
管理修改 第一次修改 -> git add -> 第二次修改 -> git commit,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交, ...
最新文章
- EXCEL基础篇(二)
- Verilog初级教程(14)Verilog中的赋值语句
- python数据库抓取并保存_python:微信消息抓取、转发和数据库存储及源码
- 大数据创业难度大 五个值得关注的重点
- 视频云下半场 向前走还是向“厚”走?
- [HAOI2007]理想的正方形
- ASP.NET : Kerberos网络认证过程
- daz模型导入marvelous_传世工坊自制Daz Studio 4.10 系列入门教程
- 三维视觉前沿进展年度报告
- CSS3---2D/3D应用
- 不花钱、不买服务器可以搭建个人博客吗?快进来,给你安排!
- 特斯拉明年会有100万辆自动驾驶出租车 你敢坐吗?
- vue 插件 滑块验证_Vue插件之滑动验证码
- Vue、 React比较
- 传奇修改map地图教程_传奇地图Objects.wil与map文件的对应关系
- 基于中间件的开发---中间件技术
- 飞控算法-姿态解算之互补滤波
- 高德地图 调用天地图 WMTS 服务
- 有哪些值得推荐的计算机专业的竞赛?
- iVMS-4200 Vs区别_理科与工科有什么区别?如何判断自己适合学那个?
热门文章
- [ 网络 ] 应用层协议 —— HTTP协议
- 机器学习SVM——实验报告
- MySql数据库之视图(定义视图、查询视图、更新视图、视图的作用)
- Cadence Orcad Capture创建多部分Symbol及Homogeneous及Heterogeneous图文教程及视频演示
- Windows驱动_WDDM之二
- tplink控制上网设备_TP-LINK无线路由器怎么设置限制别人wifi网速
- WebRtc以Trickle ICE形式去进行pair
- 程序员年薪20万、30万、40万都是什么样的体验?
- (十八)自动装配-@Autowired-构造器,参数,方法,属性
- 接口测试平台代码实现86: 全局请求头-1