Git 之 git diff

首先看一下 git diff 相关的命令

Copy Highlighter-hljs
# 显示暂存区和工作区的代码差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

在学习之前可以去下面的博客中先学习
引用自读懂diff
git diff 采用的是unix中合并格式的diff

示例文件#

为了便于讲解,先新建两个示例文件。

第一个文件叫做f1,内容是每行一个a,一共7行。

Copy Highlighter-hljs
  a
  a
  a
  a
  a
  a
  a

第二个文件叫做f2,修改f1而成,第4行变成b,其他不变。

Copy Highlighter-hljs
  a
  a
  a
  b
  a
  a
  a

合并格式的diff#

如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。
它的使用方法是加入u参数(代表unified)。

Copy Highlighter-hljs
diff -u f1 f2

显示结果如下:

Copy Highlighter-hljs
--- f1 2012-08-29 16:45:41.000000000 +0800
+++ f2 2012-08-29 16:45:51.000000000 +0800
  @@ -1,7 +1,7 @@
   a
   a
   a
  -a
  +b
   a
   a
   a

第一部分:是文件的基本信息#

Copy Highlighter-hljs
--- f1 2012-08-29 16:45:41.000000000 +0800
+++ f2 2012-08-29 16:45:51.000000000 +0800

"---"表示变动前的文件,"+++"表示变动后的文件。

第二部分,变动的位置用两个@作为起首和结束#

Copy Highlighter-hljs
@@ -1,7 +1,7 @@

前面的"-1,7"分成三个部分:
减号表示第一个文件(即f1),"1"表示第1行,"7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。
同样的,"+1,7"表示变动后,成为第二个文件从第1行开始的连续7行。

第三部分是变动的具体内容#

Copy Highlighter-hljs
   a
   a
   a
  -a
  +b
   a
   a
   a

除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行

git diff#

版本管理系统git,使用的是合并格式diff的变体

Copy Highlighter-hljs
git diff

显示结果如下:

Copy Highlighter-hljs
  diff --git a/f1 b/f1
  index 6f8a38c..449b072 100644
  --- a/f1
  +++ b/f1
  @@ -1,7 +1,7 @@
   a
   a
   a
  -a
  +b
   a
   a
   a

第一行表示结果为git格式的diff

Copy Highlighter-hljs
diff --git a/f1 b/f1

进行比较的是,a版本的f1(即变动前)和b版本的f1(即变动后)。

第二行表示两个版本的git哈希值(index区域的6f8a38c对象,与工作目录区域的449b072对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)。

Copy Highlighter-hljs
index 6f8a38c..449b072 100644

第三行第四行表示进行比较的两个文件

Copy Highlighter-hljs
  --- a/f1
  +++ b/f1

"---"表示变动前的版本,"+++"表示变动后的版本。
后面的行都与官方[上面我们说过]的合并格式diff相同

Copy Highlighter-hljs
  @@ -1,7 +1,7 @@
   a
   a
   a
  -a
  +b
   a
   a
   a
posted @   流年中渲染了微笑  阅读(510)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
CONTENTS