git 用 diff 来检查改动
用 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</h1>
+ <h1>About This Project</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</h1>
+ <h1>Imprint / Disclaimer</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 来检查改动的更多相关文章
- git 命令 git diff 查看 Git 区域文件的具体改动
查看 Git 区域文件的具体改动 git diff git status 只能让我们知道文件在 Git 区域内的改动状态,但如果我们想查看某个文件内具体改了什么(也可以理解为在不同 Git 区域中的差 ...
- Git log diff config高级进阶
Git 历史相关和 git config 高级进阶 前一段时间分享了一篇<更好的 git log>简要介绍怎么美化 git log 命令,其中提到了 alias命令,今天再继续谈谈 git ...
- svn/git的diff、patch
svn/git的diff.patch 前几天,正当我突突的写代码,企业微信嘀嘀一声响”在不,过来帮我看个bug”.本人一向助人为乐,高兴的冲了过去,然后就开始了一段长达1分钟的问题描述.很明显,此同学 ...
- 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 ...
- [SourceTree] - 提交代码失败 "git -c diff.mnemonicprefix=false -c core.quotepath=false" 之解决
背景 使用 SourceTree 提交代码失败,尝试了重装 SourceTree 和 Git 问题依旧. 错误信息 git -c diff.mnemonicprefix=false -c core.q ...
- git通过diff文件,合并未上传代码库代码
今天有段代码需要从别人的机器上同步到本地,但是这段代码还没上库,所以要么将这部分代码打包传过来,或者,用下面的办法. 由于代码修改涉及多个文件,打包搞过来确实比较麻烦,在网上找了下,发现可以用git ...
- Git命令diff格式详解
diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前的文件> <变动后的文件> ...
- git add 命令添加所有改动内容
git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件. 注意 -A 选项后面还有一个句点. git add -A表示添加所有内容 ...
- Git CMD - diff: Show changes between commits, commit and working tree, etc
命令格式 git diff [options] [<commit>] [--] [<path>…] git diff [options] --cached [<comm ...
随机推荐
- Java生鲜电商平台-销售管理设计与架构
Java生鲜电商平台-销售管理设计与架构 说明:在Java开源生鲜电商平台中,销售人员我们称为跟餐饮店老板沟通与下载APP的一类地推人员.(所谓地推指的就是一个一个上门拜访.) 由于销售人员有以下几类 ...
- Python requests库的使用(二)
1.请求异常处理 请求异常类型: 请求超时处理(timeout): 实现代码: import requestsfrom requests import exceptions #引入exc ...
- 关于BFS+异或(C++)
今天早上,我们做了场比赛,里面有一个题目是这样的.. 题目大意: 随着马场的繁荣,出现了越来越多的新马种.种族之间的沟通不畅严重影响了马场的和谐.这时,科学家发明了马语翻译机器人,正好可 ...
- AD的故事继续在Sharepoint里续演
本以为AD的开发深入工作,可能暂时先放放了,这不最近又一次接触了SP的知识领域,又一次见到了久违相识的老朋友AD域控了,让我没有想到其实服务器这块儿微软的份额这么大...不得不深思微软的核心业务是啥, ...
- CTF必备技能丨Linux Pwn入门教程——ROP技术(下)
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- 如何在linux CentOS 上安装chrome 谷歌浏览器?
获得linux命令的root权限:http://blog.csdn.net/mddy2001/article/details/76521101. 更改密码在终端中输入:sudo passwd root ...
- 【前端_css】RGB 常用颜色列表
转载博客:RGB 常用颜色列表
- [PHP] 最简单的权限控制设计
假设url部分我们只有action和method , 某个控制器下的某个方法 , 比如:log/loginlog 查看日志下的登陆日志, action就是log , method就是loginlo ...
- 10、shell编程+流程控制+分支嵌套
SHELL 编程 shell 是一个命令解释器,侦听用户指令.启动这些指令.将结果返回给用户(交互式的shell) shell 也是一种简单的程序设计语言.利用它可以编写一些系统脚本. ...
- Linux学习之常用命令(三)
常用命令之工作目录 显示当前目录 pwd[选项] 切换目录 cd [文件路径] cd /root 注意:可以使用Tab键进行路径补齐 cd .. >>返回上次的目录 显示目录以及文件信息 ...