要查看 Mac 上的 Git 仓库中某个已跟踪文件与早期版本有何不同,请打开“终端”,切换到该仓库,然后运行 git diff REVISION -- path/to/file。将 REVISION 替换为某个提交(例如 HEAD~1),并将路径替换为该文件相对于仓库的相对路径。这会将该提交版本与当前工作区中存在的文件进行比较;它不会修改该文件。
在仓库中打开“终端”
在访达(Finder)中找到仓库文件夹。打开“终端”,输入 cd (注意末尾有一个空格),将仓库文件夹拖入“终端”窗口,然后按 Return 键。Apple 官方文档指出,将项目拖入“终端”是一种指定文件和文件夹路径的方法。使用以下命令检查你是否位于 Git 工作区中:
git status
如果 Git 提示当前目录不是仓库,请切换到仓库的顶级文件夹并重试。根据 Apple 的说明,macOS 上的“终端”默认使用 zsh。以下命令均可在该 shell 中运行;它们使用带引号的路径,因此能保留名称中的空格。
将当前文件与早期版本进行比较
使用以下格式:
git diff REVISION -- "path/to/file"
例如,要将当前的 Sources/Menu.swift 文件与当前 HEAD 之前的一个第一父提交(first-parent commit)版本进行比较,请运行:
git diff 'HEAD~1' -- "Sources/Menu.swift"
-- 标记了版本和选项参数的结束以及路径的开始。Git 文档将此格式描述为工作区与指定提交之间的比较。在输出中,以 - 开头的行来自早期版本,以 + 开头的行来自当前文件,周围未做标记的行则提供上下文信息。Git diff 文档
HEAD~1 表示当前提交的第一父提交;HEAD~2 表示沿着第一父提交回溯两步。这对于查看最近的历史记录非常方便,但可能无法准确指出你所关注的特定更改,尤其是在涉及合并(merge)时。Git 的版本语法还支持分支名称、标签和提交 ID。当你需要指定某个具体的历史节点时,请使用已确认的提交 ID。Git 版本语法
要查找修改了该文件的提交,请查看其历史记录:
git log --oneline -- "Sources/Menu.swift"
从输出中复制相关的提交 ID,然后在 diff 命令中使用它:
git diff 4f2a9c1 -- "Sources/Menu.swift"
将 4f2a9c1 替换为你仓库中显示的实际 ID。Git 接受无歧义的简短提交 ID;如果该 ID 存在歧义或无效,请使用更长的 ID 或其他版本名称。
选择符合你需求的比对方式
工作区比对包含对文件所做的任何当前修改,无论这些修改是否已暂存。如果你想比较两个已提交的版本,请同时提供这两个版本:
git diff OLD_REV NEW_REV -- "Sources/Menu.swift"
例如,git diff 'HEAD~3' HEAD -- "Sources/Menu.swift" 会将回溯三个第一父提交步骤处提交的文件与当前提交处的版本进行比较。这不包括未提交的修改。Git 将这种双提交格式描述为比较两个任意提交。Git diff 文档
如果你想与为下一次提交而暂存的版本进行比较,Git 的 --cached 格式可以将暂存区(index)与某个提交进行比较。例如:
git diff --cached HEAD -- "Sources/Menu.swift"
这回答了一个与比较当前工作文件不同的问题:它显示的是相对于 HEAD 的已暂存更改。
理解空输出和常见错误
没有 diff 输出通常意味着 Git 认为在所选版本与所选当前状态之间,该路径没有任何差异。请确认路径的拼写和大小写,并确保你处于正确的仓库中。如果 Git 提示该路径在指定版本中未知,则可能是该文件当时尚不存在,或者路径发生了更改。要检查重命名或已删除的文件,请使用其历史路径,并查看相关提交的文件列表或日志。
对于 Git 从未跟踪过的文件,不存在可供比较的已提交版本。此外,对于二进制文件,Git 的常规文本 diff 可能无法提供可读的逐行对比。该命令仅用于显示更改;它不会恢复旧版本。如果你的目的只是查看,请避免使用 git checkout 或 git restore,因为这些命令会对文件产生不同的影响。
如需更精简的比对,可以添加较小的上下文行数,例如 git diff -U1 'HEAD~1' -- "Sources/Menu.swift"。Git 的 -U 选项用于控制显示的上下文行数。一旦确定了所需的版本和路径,该命令便能直观、可复现地呈现差异,同时保持文件完好无损。
参考来源
Git - git-diff 文档 — Git
Git - git-rev-parse 文档 — Git
在 Mac 上的“终端”中更改默认 Shell — Apple 支持
将项目拖入“终端”窗口 — Apple 支持