要在 Mac 上的本地 Git 项目中查找最后修改某一行的提交,请打开终端,进入代码仓库,并对带有行号范围的文件运行 git blame。然后使用 git show 检查该提交,以阅读其提交信息和 diff。Blame 会识别当前行的最后一次更改;它并不总能揭示该行最初出现的时间或编写它的原因。
1. 在终端中打开仓库
如果你已经在访达(Finder)中打开了该项目,请打开终端并输入 cd ,然后将项目文件夹拖入终端窗口并按 Return 键。macOS 会自动插入文件夹的路径;这样可以避免输入错误。或者,你也可以自行输入路径,如果路径中包含空格,请加上引号,例如:
cd "/Users/sam/Projects/My App"
检查你是否位于 Git 工作区内,以及 Git 是否可用:
git status --short
git --version
如果第一个命令提示当前目录不是 Git 仓库,请导航至项目所在的实际仓库目录。如果 git 不可用,请在继续之前通过你信任的安装方式安装或启用 Git。以下命令采用标准 shell 语法,可在 macOS 终端的默认 shell 以及其他常见 shell 中运行。
2. 针对你关心的行运行 blame
在编辑器中找到行号,然后替换下方的文件路径和行号。该路径是相对于仓库根目录的;当路径中包含空格或 shell 元字符时,请使用引号引起来。
git blame -L 42,42 -- "Sources/Settings.swift"
-L 42,42 将注解范围限制在第 42 行。Git 从 1 开始计算行号。若要查看周围的上下文,可以使用如 -L 38,46 这样的范围。Git 会输出提交标识符、作者详细信息、日期信息以及该行的文本。其官方文档将 blame 描述为显示最后修改每一行的修订版本和作者,并支持使用 -L 选择行范围。Git blame 文档
如果你不知道行号,可以在编辑器中打开该文件并查看其显示的行号。你也可以通过省略 -L 来对整个文件进行 blame:
git blame -- "Sources/Settings.swift"
当你不在仓库根目录下时,请使用相对于运行命令所在目录的路径。如果 Git 提示该路径不存在,请同时检查当前目录(pwd)以及路径的大小写和拼写是否完全准确。
3. 阅读 blame 标识出的提交
复制目标行显示的提交标识符,并将其传递给 git show:
git show --format=fuller --stat a1b2c3d
将 a1b2c3d 替换为你输出中的标识符。这将显示提交元数据和文件摘要。如果还想查看补丁内容,请省略 --stat:
git show --format=fuller a1b2c3d
查看目标行周围发生更改的行、提交信息以及同一提交中更改的其他文件。这些细节有助于理解更改的上下文。提交信息记录的是作者所写的内容,它并不能作为设计原由的绝对依据。Git 文档说明 git show 用于显示提交信息及其文本 diff。Git show 文档
当 blame 指向格式化或移动代码的提交时
某一特定行可能受到过大规模代码格式化、重命名或代码移动的影响。在这种情况下,blame 所指出的提交可能并不是最初引入该逻辑的提交。可以尝试使用移动和复制检测:
git blame -M -C -L 42,42 -- "Sources/Settings.swift"
-M 让 Git 检测在同一文件内移动的行,而 -C 还会查找从其他文件复制或移动的行。这些选项有助于 Git 追踪部分重构,但检测效果取决于匹配的内容,可能无法解析所有的历史记录。Git blame 文档
如果仓库中包含用于忽略诸如格式化等广泛更改的 .git-blame-ignore-revs 文件,你可以让 Git 使用它:
git blame --ignore-revs-file .git-blame-ignore-revs -L 42,42 -- "Sources/Settings.swift"
这可以让相关的更改更容易被发现,但被忽略的修订版本会影响注解结果;如果结果令人意外,请检查仓库的忽略文件,或与未使用该选项运行的 blame 结果进行比对。Git 文档列出了此选项,GitHub 文档中也说明了相同的忽略修订文件惯例。Git blame 文档
Blame 无法告诉你的内容
Blame 仅对所选文件版本中存在的行进行注解。它不会直接显示被删除或被替换的行,而且最近一次修改的提交可能与最初引入的提交不同。对于已删除的文本或更早的文件状态,请检查提交的 diff 和历史记录;Git 的 blame 文档建议使用 git diff 和历史记录搜索来查找删除或替换内容的更改。Git blame 文档
如果该仓库托管在 GitHub 上且你拥有访问权限,你还可以在浏览器中打开该文件并选择 Blame,以逐行查看历史记录。点击提交信息可以查看该次更改,或者使用版本控制功能查看更改之前的文件内容。GitHub 文档:查看和理解文件
来源
Git blame 文档 — Git
Git show 文档 — Git
查看和理解文件 — GitHub 文档