Git Diff
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 --cached 或 git 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。
上述所有选项在调试、审查变更或准备提交时都很有帮助。