用 diff 来检查改动

项目的开发是由无数个微小的改动组成的。了解项目开发过程的关键就是要搞清楚每一个改动。
当然你可以使用 “git status” 命令或更简单的 “git log” 命令来打印出项目的状态和历史记录,但是这些命令仅仅只能为你提供一个非常简单的信息概要,想要显示一个详细的修改信息就必须使用另外一个命令。

读懂 Diffs

在版本控制系统中用来显示两个版本之间差别的操作我们称之为 “diff”,或者 “patch”。现在就让我们来详细地学习一下这个操作吧!首先要学习如何读懂 diff 信息。

比较文件 a/b

这个 diff 操作会对两个对象进行相互比较。比如对象 A 和对象 B 。在大多数情况下 A 和 B 会是项目中的同一个文件,但它们是基于不同的版本。当然 diff 操作也可以比较两个完全没有关联的文件,并显示出它们之间的差别,但是这种操作并不会被经常使用到。
为了清楚地显示比较信息, diff 操作总是会把要比较的文件定义成 “A” 和 “B”。

文件的元数据 (Metadata)

这所说的文件元数据是非常技术性的,在实践中你可能永远不需要搞明白它。最开始的两串数字表示两个文件的 hashes(简单点说就是它们的 “ID”)。不仅仅是整个项目,Git 还会把每一个文件当作对象来保存。这个 hash ID 就代表了一个文件对象的特定版本。最后的一串数字代表了一个文件的模式(100644 代表它是一个普通的文件,100755 表示一个可执行文件,120000 仅仅是一符号链接)。

标记 a/b

继续向下观察这些输出信息,A 与 B 的真正差别会被显示在这里。为了区分它们,A 和 B 都被赋予了它们特有的符号:对于版本 A,它的符号是一个减号(“-”);而对于版本 B ,它会使用一个加号(“+”)。

区块(Chunk)

diff 操作不会显示完整的文件内容。如果两个版本仅仅存在两行代码的差别,你也不会想要去逐行地审视这个拥有上万行代码的文件吧。因此,Git 在这里只会标记出那些实际上修改的部分,在这里一段连续的改动被称之为区块(chunk 或者 hunk)。除了包括实际更改的代码行,一个区块还包括一个特定的 “上下文环境”,例如那些改变之前和之后的差别,能让你更容易地明白在特定的上下文环境中这个改变的具体含义。

区块标头(Chunk Header)

每个这样的区块都有一个标头,它被显示在两个 “@@” 符号中。在这里 Git 会告诉你哪些行存在差异。在我们的例子里这些行被标记成为第一个改动区块:

  • 来自文件 A (标记为 “-”),从第34行开始之后的6行代码。
  • 来自文件 B (标记为 “+”),从第34行开始之后的8行代码。

在那个 “@@” 结束符号之后的信息是用来表明上下文环境的,例如 Git 会尝试着为这个区块赋予一个方法名称或是其他的上下文信息。然而 Git 不能支持所有的文件内容,这很大程度上都要取决于项目所使用的开发语言。

改动

在每一个被改动过的代码行之前都会前置一个 “+” 或是 “-” 符号。就像前面所讲到的,这些符号可以帮助你准确了解版本 A 和 版本 B 。例如前置了 “-” 符号的行就代表来自版本 A,反之带有符号 “+” 的行就代表来自于版本 B。
大多数情况下,在 Git 中都使用 A 和 B 这样的方式,你可以认为 A/- 代表老的内容,而 B/+ 代表新的内容。

现在就让我们来看一下我们的例子:

  • 改动 #1 包括两行 “+” ,而在相对应的版本 A 中却不存在这些行(没有任何被前置 “-” 的行),这就表示这两行是新被添加的。
  • 改动 #2 则恰恰相反。在版本 A 中,可以看到有两行被前置上了符号 “-”。然而版本 B 却不存在对应的行(没有 “+” 行),这就表明这两行被删除了。
  • 在改动 #3 中,这些代码行发生了一些改动,前置上符号 “-” 的两行被修改了,新的改动就是在它的下面被标记了符号 “+” 的内容。

现在我们知道了如何读懂 diff 的输出信息了,来做一些练习吧!

检查本地改动

在之前的章节里,我们经常会使用 “git status” 命令来查看在本地副本(working copy)中有哪些文件被改动了。如果要想清楚地了解这些改动的细节,我们就必须使用 “ git diff” 命令:

$ git diff
diff --git a/about.html b/about.html
index d09ab79..0c20c33 100644
--- a/about.html
+++ b/about.html
@@ -19,7 +19,7 @@
</div> <div id="headerContainer">
- <h1>About&lt/h1>
+ <h1>About This Project&lt/h1>
</div> <div id="contentContainer">
diff --git a/imprint.html b/imprint.html
index 1932d95..d34d56a 100644
--- a/imprint.html
+++ b/imprint.html
@@ -19,7 +19,7 @@
</div> <div id="headerContainer">
- <h1>Imprint&lt/h1>
+ <h1>Imprint / Disclaimer&lt/h1>
</div> <div id="contentContainer">

在不带任何参数的情况下,“git diff” 会为我们给所有在本地副本中还未被打包(unstaged)的变化做个比较,并显示出来。
如果你仅仅是想要查看那些对于已被打包的改动的比较结果,你可以选择使用 “git diff --staged” 命令。

检查已提交的改动

你已经学习过了 “git log” 命令,它会打印出那些最新提交的概要。但是它仅仅显示一些最基础的信息(hash,作者,时间,注释)。如果你想要查看那些改动的细节,你就可以加上 “-p” 参数来得到一个更详细的修改信息。

比较分支和版本

最后,你可能想要知道如何比较两个分支,或是两个特定项目版本。来让我们看看在 “contact-form” 分支的哪些改动并不存在于 “master” 上:

$ git diff master..contact-form

相反,这些比较信息仅仅是在分支层面上的,你也可以比较任意的两个项目版本之间的内容:

$ git diff 0023cdd..fcd6199

git 用 diff 来检查改动的更多相关文章

  1. git 命令 git diff 查看 Git 区域文件的具体改动

    查看 Git 区域文件的具体改动 git diff git status 只能让我们知道文件在 Git 区域内的改动状态,但如果我们想查看某个文件内具体改了什么(也可以理解为在不同 Git 区域中的差 ...

  2. Git log diff config高级进阶

    Git 历史相关和 git config 高级进阶 前一段时间分享了一篇<更好的 git log>简要介绍怎么美化 git log 命令,其中提到了 alias命令,今天再继续谈谈 git ...

  3. svn/git的diff、patch

    svn/git的diff.patch 前几天,正当我突突的写代码,企业微信嘀嘀一声响”在不,过来帮我看个bug”.本人一向助人为乐,高兴的冲了过去,然后就开始了一段长达1分钟的问题描述.很明显,此同学 ...

  4. git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origin

    git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origi ...

  5. [SourceTree] - 提交代码失败 "git -c diff.mnemonicprefix=false -c core.quotepath=false" 之解决

    背景 使用 SourceTree 提交代码失败,尝试了重装 SourceTree 和 Git 问题依旧. 错误信息 git -c diff.mnemonicprefix=false -c core.q ...

  6. git通过diff文件,合并未上传代码库代码

    今天有段代码需要从别人的机器上同步到本地,但是这段代码还没上库,所以要么将这部分代码打包传过来,或者,用下面的办法. 由于代码修改涉及多个文件,打包搞过来确实比较麻烦,在网上找了下,发现可以用git ...

  7. Git命令diff格式详解

    diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前的文件> <变动后的文件> ...

  8. git add 命令添加所有改动内容

    git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件. 注意 -A 选项后面还有一个句点. git add -A表示添加所有内容 ...

  9. Git CMD - diff: Show changes between commits, commit and working tree, etc

    命令格式 git diff [options] [<commit>] [--] [<path>…​] git diff [options] --cached [<comm ...

随机推荐

  1. SQLMAP 速查手册

    /pentest/database/sqlmap/txt/ common-columns.txt 字段字典 common-outputs.txt common-tables.txt 表字典 keywo ...

  2. Mysql Join-连接查询(上)

    认识 多表连接查询,我感觉应该是关系型数据库最能体现其价值和灵活性的地方吧. 我觉得数据库的作用, 归纳起来无非就是存储和查询. 一言蔽之,数据库就是能灵活地存储和查询数据. 存储上, 也是以文件的方 ...

  3. centos6.8下hadoop3.1.1完全分布式安装指南

    前述:这篇文档是建立在三台虚拟机相互ping通,防火墙关闭,hosts文件修改,SSH 免密码登录,主机名修改等的基础上开始的. 一.传入文件 1.创建安装目录 mkdir /usr/local/so ...

  4. MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  5. redis报错: redis.exceptions.ResponseError: value is not an integer or out of range

    问题描述 今天在使用python的redis客户端时碰到了这样的报错:redis.exceptions.ResponseError: value is not an integer or out of ...

  6. git仓库的安装和基本使用

    一.安装git软件 # yum install git -y 二.初始化git仓库 2.1 在git仓库的机器进行配置 # ifconfig eth0 | awk -F '[ :]+' 'NR==2 ...

  7. NLP中的预训练语言模型(五)—— ELECTRA

    这是一篇还在双盲审的论文,不过看了之后感觉作者真的是很有创新能力,ELECTRA可以看作是开辟了一条新的预训练的道路,模型不但提高了计算效率,加快模型的收敛速度,而且在参数很小也表现的非常好. 论文: ...

  8. SDL2学习(一): 显示一张图片

    SDL是一个跨平台的多媒体库,它通过OpenGL和2D视频帧缓冲,提供了针对音频.视频.键盘.鼠标.控制杆及3D硬件的低级别的访问接口.这里使用较新的SDL2库. 1. 配置SDL开发环境 1.1 下 ...

  9. 树莓派搭建SVN服务器

    1.安装SVN服务器 sudo apt-get install subversion -y 2.创建仓库 mkdir /home/pi/svnRepository svnadmin create /h ...

  10. 18-numpy笔记-莫烦pandas-6-plot显示

    代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt data = pd.Series(np.random ...