两次提交之间的文件比较

git diff 命令可以传递给 Git 引用,例如头部、标签和分支的名称。
Git 中的每个提交都有其提交 ID,可以在执行 git log 时获取。
提交 ID 也可以传递给 git diff。

分行比较

分支比较的执行类似于 git diff 的其他 ref 输入。
让我们看看点运算符示例:

git diff branch1..branch2

上面例子中的两个点表明 diff 输入是两个分支的提示。
如果省略点并在分支之间使用空间,我们将获得相同的结果。
此外,还有一个三点运算符:

git diff branch1...branch2

三点运算符更改启动差异的第一个输入参数 branch1.
它将 branch1 转换为两个 diff 输入之间共享的共同祖先提交的引用。
最后一个输入参数与 branch2 的尖端保持相同。

说明

git diff 是一个多功能的 Git 命令,用于比较 Git 中提交的更改。
特别是,在这个命令的帮助下,我们可以获取两个输入数据集并输出它们之间的修改。
执行时,此命令会在 Git 数据源上运行 diff 函数。
通常,它与 git status 和 git log 命令结合使用,用于分析 git 存储库的状态。

git diff Git 差异

git差异输出

Diffing 可以有多个输出,这将在下面讨论。

git原始输出格式

看看下面的命令来创建一个简单的存储库:

mkdir test_repo
cd test_repo
touch test.txt
echo "this is a git diff test example" > test.txt
git init .
#Initialized empty Git repository in /Users/kev/code/test/.git/
git add test.txt
git commit -am "add diff test file"
#[master (root-commit) 9e2dcac] add diff test file
#1 file changed, 1 insertion(+)
#create mode 100644 test.txt

如果你想让 git diff 有输出,你必须在将它添加到创建的存储库后更改 test.txt 文件的内容。
我们可以通过执行以下命令来完成:

echo "this is a diff example" > test.txt

只有现在我们才能查看差异并讨论输出。
执行 git diff 将产生以下结果:

diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

不同的输入源

我们可以在下面找到 diff 的比较输入。
结果,a/test.txt 和 b/test.txt 将被传递给差异。

diff --git a/test.txt b/test.txt

元数据

这一行显示了一些内部 Git 元数据。
此输出中的数字与 Git 对象版本哈希标识符匹配。

index 6b0c6cf..b37e70a 100644

变化符号

这些行显示分配给每个差异输入源的符号。
来自 a/test.txt 的更改标有 -- 并且来自 b/test.txt 的更改标有 +++ 符号。

--- a/test.txt
+++ b/test.txt

差异块

diff 不会显示整个文件。
它只显示修改过的行。
修改后的部分称为“块”。
块的优点是它们在更改前后显示了线条,因此我们可以更好地了解修改。

@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

第一行是块头。
每个块都由@@ 符号内的标题放置。
对文件所做的更改汇总在标题中。

突出显示变化

我们可以使用以下 2 个工具来突出显示更改,以便它们更加明显。

git diff --color-words

第一种高亮变化的方式是 git diff 提议的特殊模式:--color-words。
它通过空格标记添加和删除的行,然后对它们进行区分。

git diff --color-words
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
this is agit difftest example

git diff-highlight

在克隆git源的情况下,会发现一个子目录调用contrib。
该子目录包含与 Git 相关的工具。
其中一种工具称为 diff-highlight。
它突出显示更改的子词片段。

git diff | /your/local/path/to/git-core/contrib/diff-highlight/diff-highlight
diff --git a/test.txt b/test.txt
index 6b0c6cf..b37e70a 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example

自最近提交以来的更改

最初, git diff 显示自最近一次提交以来所有未提交的更改:

git diff

所有变化的比较

为了比较整个 repo 中的更改,我们应该在没有文件路径的情况下运行 git diff。
因此,我们可以在没有“./path/to/file”参数的情况下调用上面的示例,并在本地存储库中的所有文件中获得相同的结果。

文件比较:git diff 文件

git diff 命令还有一个显式文件路径选项。
一旦文件路径传递给 git diff,Git diff 操作将遍历特定文件。
在下面的示例中,'./path/to/file' 参数会将工作目录中的修改与索引进行比较,并显示尚未暂存的更改。
它将执行与 HEAD 的比较。

git diff HEAD ./path/to/file

比较二进制文件

Git diff 不仅可以在文本文件上运行,还可以在二进制文件上运行。
默认选项有时不是很有用。

git diff
Binary files a/script.pdf and b/script.pdf differ

Git 有一个特性,允许你在执行差异之前指定一个 shell 命令来将二进制文件内容转换为文本。
但是,可能需要进行一些设置。
首先,我们应该定义一个 textconv 过滤器,其中描述了某种类型的二进制到文本的转换方式。
例如,我们可以使用名为 pdftohtml(可通过自制软件获得)的简单实用程序将 PDF 转换为 HTML。
有两种设置方式:编辑 .git/config 文件,或者全局编辑 .gitconfig。

[diff "pdfconv"]
textconv=pdftohtml -stdout

然后我们需要将一个或者多个文件模式与 pdfconv 过滤器连接起来,这可以通过在存储库的根目录中创建一个 .gitattributes 文件来完成。

*.pdf diff=pdfconv

配置完成后, git diff 将首先通过配置的转换器脚本运行二进制文件并比较转换器的输出。
使用相同的技术,我们还可以从所有类型的二进制文件(zip、jar 和其他档案)中获得有用的差异。

比较两个分支的文件

为了比较分支中的特定文件,我们应该将文件路径作为第三个参数传递给 git diff:

git diff master new_branch ./test.txt
日期:2020-06-02 22:16:33 来源:oir作者:oir