一、git diff 命令的格式
git diff 的功能非常强大。如果你选择两个不同的根级树对象进行比较,git diff 将会得到这两个项目状态的所有不同。
以下三个可供树或类树对象使用的 git diff 命令的基本
- 整个提交图中的任意树对象
- 工作目录
- 索引
通常,git diff 命令进行树的比较时可以通过提交名、分支名或者标签名。工作目录的文件和目录结构还有在索引中暂存文件的完整结构,都可以被看做树。
git diff 命令可以使用上述三种来源的组合来进行如下 4 种基本比较。
git diff
git diff 工作目录和索引之间的差异。同时它会显示工作目录里什么是“脏的”,并把这个“脏”文件作文下个提交暂存的候选。这条命令不会显示索引中的和永久存在版本库中的文件的不同(更不必说可能相关的远程版本库)。
git diff commit
这个形式的命令会显示工作目录中和给定提交中的变更之间的差异。常见的一种用法是用 HEAD 或者一个特定的分支名作为 commit。
git diff -cached commit
这条命令会显示索引中的变更和给定提交中的变更之间的差异。如果省略 commit 这一项,则默认为 HEAD 。使用 HEAD,该命令会显示下次提交会如何修改当前分支。
git diff commit1 commi2
如果你任意指定两个提交,这条命令会显示它们之间的差异。这条命令会忽略索引和工作目录,它是任意比较对象库中两个树对象的实际执行方法(workhorse)。
除了上述的 4 种基本形式的 git diff 命令之外,还有很多选项。以下是比较有用的选项:
–M
这个选项可以用来查找重命名并且生成一个简化的输出,只简单地记录文件重命名而不是先删除再添加。如果文件不是纯的重命名,同时还有内容上的更改,那么 Git 也会将它们调出了。
-w 或者 –ignore-all-space
这两个选项令比较时忽略空白字符
–stat
这个选项会显示两个树状态之间的差异的统计数据。报告用简洁的语法显示有多少行发生了改变, 有多少行添加了,有多少行删除了。
–color
这个选项会使输出结果使用多种颜色显示,一种颜色显示 diff 中的一种变化。
最后,git diff 命令可限制为显示一组指定文件和目录间的差异
二、git diff 和提交范围
git diff命令支持两点语法来显示两个提交之间的不同。下面两条命令是等价的。
$ git diff master bug/pr-1
$ git diff master..bug/pr-1
两点语法在 git diff 中的用法和 git log 中的用法有很大的不同。
- git diff 不关心它比较的文件的历史,也不关心分支。
- git log 特别关注一个文件是如何变成另外一个文件的。比如,当产生分支时,在每个分支上发生了什么。
这两条命令执行完全不同的操作。log 操作一系列提交,而 diff 操作两个不同的结点。
git log master..maint 命令会显示在 maint 分支而不在 master 分支中的所有提交。而 git diff master..maint 显示 maint 处(分支的头部)和 master 处的树之间的全部差异。
三、路径限制的 git diff
在默认情况下,git diff 操作h会基于从给定树对象的根开始的整个目录结构。可以使用和 git log 中相同的路径限制手段来限制 git diff 只输出版本库的一个子集。
如果要只显示一个文件夹 Documentation 的更改,需要使用命令
$ git diff --stat master~5 master Documentation
当然,也可以只查看一个文件的差异
$ git diff master~5 master Documentation/hello.txt
下面例子中,-S“string ”选项用来在 master 分支最近 50 个提交中搜索包含 string 的变更。
$ git diff -S"output" master~50