Git diff是一个多用途的Git命令,它在执行时在Git数据源上运行diff函数。这些数据源可以是提交、分支或文件等。本章将讨论常见的git diff工作流模式调用和不同的工作流模式。Git diff命令通常与Git status和git log一起使用,用于分析git仓库的当前状态。
读区差异: 输出原始输出格式下面的例子将在一个简单的repo中执行。使用以下命令创建仓库:
$ mkdir diff _ test _ repo $ CD diff _ test _ repo $ touch diff _ test . txt $ echo & # 34;这是一个git diff测试示例& # 34;& gtdiff_test.txt $ git init。 初始化了/Users/jiyik/workspace/diff _ test _ repo/中的空Git储存库。git/ $ git add diff _ test . txt $ git commit-am & # 34;添加差异测试文件& # 34; [main(root-commit)6f 77 fc 3]添加diff测试文件 1个文件已更改,1个插入(+) create mode 100644 diff _ test . txt如果我们此时执行git diff,将不会有实际输出。这是预期的行为,因为执行diff的当前仓库没有变化。让我们修改一下diff_test.txt文件的内容。
$ echo & # 34这是一个不同的例子& # 34;& gt修改diff_test.txt后,我们可以查看差异并分析输出。现在执行git diff将输出以下内容:
diff --git a/diff_test.txt b/diff_test.txt index 6b0c6cf..b37e70a 100644 --- a/diff_test.txt +++ b/diff_test.txt @@ -1 +1 @@ -this is a git diff test example +this is a diff example
diff-git a/diff _ test . txt b/diff _ test . txt
index 6b 0 c 6 cf..b 37 e 70 a 100644
-a/diff _ test . txt
+++b/diff _ test . txt
@ @-1+1 @ @
-这是一个git diff测试示例
+这是一个diff示例
Git diff视图差异
现在,让我们将diff输出拆分如下
1. 比较输入diff-gita/diff _ test . txt b/diff _ test . txt这一行显示差异的输入源。我们可以通过diff来比较a/diff_test.txt和b/diff_test.txt。
2. 元数据行索引6b0b6cf..b37e70a100644显示了一些内部Git元数据。我们可能不需要这些信息。这个输出中的数字对应于Git对象版本散列标识符。
3. 变化标记-A/diff _ test . txt ++ b/diff _ test . txt这些行说明了分配给每个差分输入源的符号。在这种情况下,更改a/diff_test.txt用-标记,更改b/diff_test.txt用++符号标记。
4. 差异块剩余的差异输出是差异“块”的列表。Diff仅显示文件中已更改的部分。在我们当前的例子中,我们只有一个块,因为我们的文件相对简单。块有自己的粒度输出语义。
@ @-1+1 @ @ -这是一个git diff测试示例 +这是一个diff示例第一行是块头。每个块都有一个包含在@@ @符号中的头作为前缀。标题的内容是对文件所做更改的总结。在我们的简化示例中,我们用-1 +1来表示第一行已经更改。在实践中,我们可能会看到以下标题:
@@ -34,6 +34,8 @@在这个标题示例中,从第34行提取了6行。此外,还从34号线增加了8条线。
高亮显示变化Git diff还有一个特殊的模式,可以更好地突出显示变化:颜色词。在这种模式下,添加和删除的行用空标记,然后进行区分。
$ git diff --color-words diff --git a/diff_test.txt b/diff_test.txt index 6b0c6cf..b37e70a 100644 --- a/diff_test.txt +++ b/diff_test.txt @@ -1 +1 @@ this is agit difftest example
$ git diff-color-words
diff-git a/diff _ test . txt b/diff _ test . txt
index 6b 0 c 6 cf..b 37 e 70 a 100644
-a/diff _ test . txt
+++b/diff _ test . txt
@ @-1+1 @ @
这是一个agit difftest示例
Git diff突出显示更改
现在,输出只显示已经改变的颜色编码的单词。
比较二进制文件到目前为止我们演示的例子都是文本文件,git diff也可以在二进制文件上运行。不幸的是,默认的输出不是很有帮助。
$ git diff binary files a/script . pdf和b/script.pdf differjit有一个特性,允许我们指定一个shell命令,将二进制文件的内容转换成文本,然后再执行差分。但是,它需要一些设置。首先,我们需要指定一个textconv过滤器来描述如何将某种类型的二进制文件转换成文本。假设我们正在使用一个名为pdftohtml(可以通过自制软件获得)的简单程序将PDF转换成可读的html。我们可以通过编辑。git/config文件,或者编辑全局设置~ /.gitconfig。
[diff & # 34;pdfconv & # 34] text conv = PDF to HTML-stdout然后需要做的就是将一个或多个文件模式与我们的pdfconv过滤器相关联。我们可以通过创建一个文件来做到这一点。仓库根目录中的gitattributes。
*.pdf diff = pdf conv配置完成后,git diff将首先通过配置的转换器脚本运行二进制文件,并比较转换器输出。同样的技术可以应用于从各种二进制文件(如zip、jar等)中获得有用的差异。
比较文件:git diff 文件Git diff命令可以传递一个显式的文件路径选项。指定文件后,比较将限于指定的文件。
$ Gitdiffhead。/path/to/file 比较两个不同提交之间的文件git diff可以将git引用传递给diff函数。一些示例引用是HEAD标签和分支名称。Git中的每个提交都有一个提交ID,我们可以执行git log来检查提交ID。然后我们可以将这个提交ID传递给git diff。
$ git diff ed18a3a99be97518146857cbe1f00f82612dde68 33342da780e0efde4074aced294711a681a241c3
$ git diff ed 18 a 3a 99 be 97518146857 CBE 1 f 00 f 82612 DDE 68 33342 da 780 E0 efde 4074 aced 294711 a 681 a 241 c 3
Git diff比较两个提交之间的差异。
比较分支要比较来自两个分支的文件,需要将文件路径作为第三个参数传递给git diff。
$ git diff master dev hello.txt
$ git diff master dev hello . txt
Git diff比较两个分支之间的差异