Git diff 操作怎么用?如何比较文件差异?

文章导读
Previous Quiz Next Git 中的 git diff 命令提供了对仓库各种状态和对象变更的详细分析,包括 working tree、index、tree、merge 结果、blob 对象和磁盘文件。
📋 目录
  1. 选项
A A

Git Diff



Previous
Quiz
Next

Git 中的 git diff 命令提供了对仓库各种状态和对象变更的详细分析,包括 working tree、index、tree、merge 结果、blob 对象和磁盘文件。

它提供了对差异的全面洞察,对于有效理解和管理版本控制至关重要。

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

  • 显示对 index 和 working tree 所做的变更。

  • 显示 index 与特定 tree(如 HEAD)之间的差异。

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

  • 显示 merge 结果之间的差异。

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

它提供了对各种 Git 状态和对象之间差异的全面洞察,这使其对于理解变更并高效处理版本控制至关重要。

git diff [<options>] [--] [<path>]
  • 命令 git diff [<options>] [--] [<path>...] 让我们查看相对于暂存区(或 index)的变更,这些变更尚未暂存以用于即将进行的 commit。

  • 这些差异显示了可以使用 git add 添加到 index 的变更。

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

  • 除非我们比较的是受 Git 管理的 working tree 中的路径,且至少一个路径位于 working tree 之外。

  • 或者如果 Git 未管理 working tree,则必须使用 --no-index 选项。

  • 此版本的 git diff 隐含了 --exit-code 选项,该选项指示路径之间是否存在差异。

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>]
  • 它评估相对于给定 <commit> 已暂存以用于即将进行的 commit 的变更。

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

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

  • --merge-base 选项代替使用 <commit>,而是使用 <commit> 和 HEAD 的 merge base。

  • --staged--cached 可以互换使用。

git diff [<options>] [--merge-base] <commit> [--] [<path>]
  • 它评估 working tree 的修改相对于指定的 <commit>。

  • 要比较一个分支的 tip 与最新 commit,使用 HEAD

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

  • --merge-base 计算 <commit> 和 HEAD 之间的 merge base 以找到比较基准。

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

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

  • 如果指定了 --merge-base,则计算两个 commit 的 merge base 以确定比较的 before 侧。

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

git diff [<options>] <commit> <commit> <commit> [--] [<path>]
  • 用于查看 merge commit 导致的变更。

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

  • 后缀如 ^@^! 可以轻松定义所需的修订版本。

  • 例如,git diff A A^@git diff A^!git show A 会生成 merge commit A 的组合 diff。

git diff [<commit>] <commit>..<commit> [--] [<path>]
  • 类似于不带 .. 的形式,让我们查看两个任意 <commit> 对象之间的差异。

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

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

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> 行上下文的统一 diff,例如 -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> 选项来自定义在生成的补丁中表示新行、旧行或上下文行的字符。

  • 这些字符默认是 + 表示新行,- 表示现有行,以及 ' '(空格表示上下文行)。

  • 这些参数可以自定义补丁中 diff 的图形显示方式。

--raw

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

  • 此格式有助于脚本编写和自动化处理。

--patch-with-raw

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

  • 它生成带有 raw 格式输出的补丁。

--indent-heuristic

  • Git 有一个名为 --indent-heuristic 的选项,它激活一个启发式算法,通过修改 diff hunk 边界来提高补丁的可读性。

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

--no-indent-heuristic

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

--minimal

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

--patience

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

上述所有选项在调试、审查变更或准备提交时都很有帮助。