参数 说明
-p, -u, --patch 生成补丁文件
-s, --no-patch 抑制差异输出。对于默认显示补丁的命令(如 git show),或取消 --patch 的效果很有用
--raw 以原始格式生成差异
--diff-algorithm= 选择差异算法。可选的变体有:myers、minimal、patience、histogram
--summary 输出扩展头信息的简洁摘要,例如创建、重命名和模式更改
--name-only 只显示已更改文件的名称
--name-status 显示已更改文件的名称和状态。常见的状态有:M(已修改)、A(已添加)、D(已删除)
--check 如果更改引入冲突标记或空白错误,发出警告。空白错误的类型由 core.whitespace 配置控制。默认情况下,行尾空白(包括仅由空白组成的行)以及行首缩进中直接跟在空白字符后的制表符被视为空白错误。如果发现问题,退出状态为非零。与 --exit-code 不兼容
--full-index 在生成补丁格式输出时,显示完整的预图像和后图像 blob 对象名称,而不仅仅是前几个字符
--binary 除了 --full-index,输出一个可以使用 git apply 应用的二进制差异
-a, --text 将所有文件视为文本文件
--color 设置颜色模式;例如,使用 --color=always,如果你希望将差异管道传输到 less 并保留 Git 的颜色编码

6.1 显示工作分支中的差异

git diff

这将显示当前分支自上次提交以来的未暂存更改。它仅显示相对于索引的更改,意味着它显示的是你可以添加到下一个提交的内容,但尚未暂存。要暂存这些更改,可以使用 git add。

如果文件已暂存,但在此之后又被修改,git diff 将显示当前文件与暂存版本之间的差异。

6.2 显示两个提交之间的更改

git diff 1234abc..6789def # old new

例如:显示最后 3 次提交所做的更改:

git diff @~3..@ # HEAD -3 HEAD

注意:两个点(..)是可选的,但可以增加清晰度。

这将显示两个提交之间的文本差异,无论它们在树中的位置如何。

6.3 显示暂存文件的差异

git diff --staged

这将显示上一次提交与当前暂存文件之间的更改。

注意:你也可以使用以下命令来实现相同的效果:

git diff --cached

这只是 --staged 的同义词,或者

git status -v

这将触发状态命令的详细模式。

6.4 比较分支

显示原始分支和新分支尖端之间的更改:

git diff original new # 等同于 original..new

显示自原始分支分支以来新分支上的所有更改:

git diff original...new # 等同于 $(git merge-base original new)..new

仅使用一个参数,例如

git diff original

等同于

git diff original..HEAD

6.5 显示暂存和未暂存的更改

要显示所有暂存和未暂存的更改,使用:

git diff HEAD

注意:你也可以使用以下命令:

git status -vv

区别在于后者的输出实际上会告诉你哪些更改已暂存用于提交,哪些尚未暂存。

6.6 显示特定文件或目录的差异

git diff myfile.txt

显示指定文件(myfile.txt)的上一次提交版本与尚未暂存的本地修改版本之间的差异。

这也适用于目录:

git diff documentation

上述命令显示指定目录(documentation/)中所有文件的上一次提交版本与尚未暂存的本地修改版本之间的差异。

要显示某个特定提交版本的文件与本地 HEAD 版本之间的差异,可以指定要比较的提交:

git diff 27fa75e myfile.txt

或者如果你想查看两个不同提交之间的版本差异:

git diff 27fa75e ada9b57 myfile.txt

要显示由哈希值 ada9b57 指定的版本与分支 my_branchname 上的最新提交之间的差异,仅限于名为 my_changed_directory/ 的相对目录,可以这样做:

git diff ada9b57 my_branchname my_changed_directory/

6.7 查看长行的单词差异

git diff [HEAD|--staged...] --word-diff

与其显示更改的行,这将显示行内的差异。例如,而不是:

-Hello world
+Hello world!

整个行被标记为已更改,单词差异会改变输出为:

Hello [-world-]{+world!+}

你可以通过指定 --word-diff=color 或 --color-words 来省略标记 [-, -] 和 {+, +}。这将仅使用颜色编码来标记差异:

查看长行的单词差异

6.8 显示当前版本与上一版本之间的差异

git diff HEAD^ HEAD

这将显示上一次提交与当前提交之间的差异。

6.9 生成与补丁兼容的差异

有时你只需要一个差异以便使用 patch 命令应用。常规的 git diff 不起作用。试试这个:

git diff --no-prefix > some_file.patch

然后在其他地方可以这样反向操作:

patch -p0 < some_file.patch

6.10 查看两个提交或分支之间的差异

查看两个分支之间的差异:

git diff <branch1>..<branch2>

查看两个提交之间的差异:

git diff <commitId1>..<commitId2>

查看与当前分支的差异:

git diff <branch/commitId>

查看更改摘要:

git diff --stat <branch/commitId>

查看在某个提交之后更改的文件:

git diff --name-only <commitId>

查看与某个分支不同的文件:

git diff --name-only <branchName>

查看在某个提交之后某个文件夹内更改的文件:

git diff --name-only <commitId> <folder_path>

6.11 使用 meld 查看工作目录中的所有更改

git difftool -t meld --dir-diff

将显示工作目录中的更改。或者,

git difftool -t meld --dir-diff [COMMIT_A] [COMMIT_B]

将显示两个特定提交之间的差异。

6.12 比较 UTF-16 编码文本和二进制 plist 文件

你可以通过指定 Git 如何比较这些文件来比较 UTF-16 编码的文件(例如 iOS 和 macOS 的本地化字符串文件)。

将以下内容添加到你的 ~/.gitconfig 文件中:

[diff "utf16"]
textconv = "iconv -f utf-16 -t utf-8"

iconv 是一个用于转换不同编码的程序。

然后编辑或创建一个 .gitattributes 文件,放在你希望使用它的仓库根目录下。或者直接编辑 ~/.gitattributes。

*.strings diff=utf16

这将在 Git 比较时将所有以 .strings 结尾的文件转换为 UTF-8。

你可以对其他可以转换为文本的文件执行类似的操作。

对于二进制 plist 文件,编辑 .gitconfig:

[diff "plist"]
textconv = plutil -convert xml1 -o -

并 .gitattributes:

*.plist diff=plist