Git Diff



Git 中的 git diff 命令提供了对跨各种仓库状态和对象的更改的详细分析,包括工作树、索引、树、合并结果、blob 对象和磁盘文件。

它提供了对差异的全面了解,使其成为有效理解和管理版本控制的关键。

命令 git diff 是一个灵活的 Git 命令,它可以:

  • 显示对索引和工作树所做的更改。

  • 显示索引和特定树(如 HEAD)之间的差异。

  • 评估两个不同树之间的差异。

  • 显示合并结果之间的差异。

  • 比较磁盘上的单个文件或 blob 对象。

它提供了对各种 Git 状态和对象之间差异的彻底了解,这对于理解更改和有效处理版本控制至关重要。

git diff [<options>] [--] [<path>…​]
  • 命令 git diff [<options>] [--] [<path>...] 允许我们查看相对于暂存区(或索引)的更改,这将显示尚未为即将到来的提交暂存的更改。

  • 差异显示了可以使用 git add 添加到索引的更改。

git diff [<options>] --no-index [--] <path> <path>
  • 它避免使用 Git 的索引,并直接在文件系统上比较两个提供的路径。

  • 除非我们正在比较受 Git 管理的工作树内的路径,并且至少有一个路径位于工作树之外。

  • 或者除非 Git 没有管理工作树,否则我们必须使用 --no-index 选项

  • --exit-code 选项(指示路径之间是否存在差异)由此版本的 git diff 暗示。

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]
  • 它评估与给定的 <commit> 相比,为即将到来的提交暂存的更改。

  • 如果没有提供 <commit>,则默认使用 HEAD

  • 如果没有提供 <commit> 并且 HEAD 不存在(例如,未创建的分支),则将显示所有已暂存的修改。

  • --merge-base 选项使用 <commit> 和 HEAD 的合并基,而不是使用 <commit>。

  • --staged--cached 可互换。

git diff [<options>] [--merge-base] <commit> [--] [<path>…​]
  • 它评估我们工作树相对于指定的 <commit> 的修改。

  • 要将一个分支的顶端与最新的提交进行比较,请使用 HEAD

  • 要比较另一个分支的顶端,请使用分支的名称。

  • 要查找比较的基础,--merge-base 计算 <commit> 和 HEAD 之间的合并基。

  • 例如,git diff $(git merge-base A HEAD) 等同于 git diff --merge-base A

git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>…]
  • 它比较两个给定的 <commit> 对象的更改。

  • 如果指定了 --merge-base,则计算这两个提交的合并基以确定比较的 before 部分。

  • 例如,git diff $(git merge-base A B) Bgit diff --merge-base A B 相同。

git diff [<options>] <commit> <commit>…​ <commit> [--] [<path>…​]
  • 它用于查看合并提交产生的更改。

  • 合并本身必须是第一个列出的 <commit>,后续提交是其父提交。

  • 诸如 ^@^! 之类的后缀使定义所需的修订变得容易。

  • 例如,合并提交 A 的组合差异由 git diff A A^@git diff A^!git show A 生成。

git diff [<commit>] <commit>..<commit> [--] [<path>…​]
  • 与不带 .. 的形式一样,允许我们查看两个随机 <commit> 对象之间的差异。

  • 默认情况下,当其中一侧缺少 <commit> 时,使用 HEAD 进行比较。

  • 此命令有助于将提交与当前工作状态进行比较,或分析某些提交之间的差异。

git diff [<options>] <blob> <blob>
  • Git 命令 git diff [<options>] <blob> <blob> 比较并显示两个 blob 对象的原始内容之间的差异。

  • 我们可以使用此命令直接比较存储库中文件或对象的内容。

选项

git diff 命令具有以下选项:

比较更改

以下是可用于比较更改的命令列表:

  • git diff - 显示未暂存的更改。

  • git diff --cachedgit diff --staged - 显示已暂存的更改。

  • git diff <commit1><commit2> - 显示两个不同提交之间的更改。

  • git diff <branch1><branch2> - 显示两个不同分支之间的更改。

基于输出格式

以下是基于输出格式使用的选项列表:

  • --stat - 显示更改的摘要,即每个文件的添加和删除行数。

  • --name-only - 只显示已更改文件的名称。

  • --name-status - 显示已更改文件的名称和状态,无论是添加、删除还是修改。

  • --color - 显示彩色输出,有助于可读性。

基于限制输出

以下是基于限制输出使用的选项:

  • -U<n> - 显示具有 <n> 行上下文内容的统一差异,例如 -U5 显示五行上下文内容。

  • --word-diff - 在单词级别显示更改并突出显示它们。

基于忽略更改

以下是基于忽略更改使用的选项:

  • --ignore-space-at-eol - 忽略行尾的空格更改。

  • --ignore-space-change - 忽略空格数量的更改。

  • --ignore-all-space - 忽略所有空格。

使用补丁

以下是基于使用补丁的选项:

  • -p--patch - 以补丁格式显示差异。

  • 这些选项告诉 Git 自动生成补丁。

组合选项

可以组合使用两个或多个选项,例如 --stat--cached

-s

--no-patch

  • 在 Git 中,-s--no-patch 选项完全抑制 diff 机制的输出。

  • 当我们希望隐藏来自诸如 git show 之类命令的补丁输出时,此选项非常有用,因为这些命令默认情况下会显示补丁。

  • 此外,此选项可以反转之前在命令行或别名中提供的选项(如 --patch--stat)的效果。

--output=<file>

  • Git 的 --output=<file> 选项允许我们将命令的输出定向到指定的文件,而不是标准输出 (stdout)。

  • 这对于立即将命令输出或结果存储到文件中以进行处理或将来参考非常有用。

--output-indicator-new=<char>

--output-indicator-old=<char>

--output-indicator-context=<char>

  • Git 允许我们使用 --output-indicator-new=<char>--output-indicator-old=<char>--output-indicator-context=<char> 选项来自定义用于表示创建的补丁中的新行、旧行或上下文行的字符。

  • 这些字符默认为新行使用 +,现有行使用 -,上下文行使用 ' '(空格)。

  • 可以使用这些参数自定义补丁中图形化显示差异的方式。

--raw

  • 当使用 --raw 选项生成 diff 输出时,Git 会生成文件更改的机器可读表示。

  • 对于脚本编写和自动化处理,此格式非常有用。

--patch-with-raw

  • 在 Git 中,-p --raw 等效于 --patch-with-raw 选项。

  • 它生成一个包含原始格式输出的补丁。

--indent-heuristic

  • Git 有一个名为 --indent-heuristic 的选项,它会激活一种启发式方法,该方法会修改 diff 块边界以提高补丁的可读性。

  • 通过增强 diff 中更改的可视清晰度,这种默认启用的启发式方法旨在使它们更容易理解和审查。

--no-indent-heuristic

  • Git 选项 --no-indent-heuristic 将关闭修改 diff 块边界以使补丁更易于阅读的启发式方法。

--minimal

  • Git 中的 --minimal 选项确保通过花费额外的时间来优化输出以生成尽可能小的 diff。

--patience

  • Git 中的--patience选项使用patience diff算法来生成差异。

以上所有提到的选项在你调试、审查更改或准备提交时都很有帮助。

广告