用途:这是一套 Git 考古(git archaeology)操作指南,帮助定位代码变更原因、找出引入某行代码或某个 bug 的提交,并完整阅读体量较大的 diff。
主要能力与用法: 搜索提交时可组合三种方式,并用变量名、函数名作为搜索词:git log --grep="search term" 查提交信息;git log -S "search term" 查找添加或删除该字符串的提交;git log -G "regex pattern" 查找 diff 匹配正则的提交。可加 --oneline 精简列表、-p 显示 diff、--all 包含其他分支。
追踪行或函数的完整历史用 git log -L,它显示触及某行范围的每次提交,而 git blame 只显示最后一次。Git 会跟随行内容穿过其上方的新增、删除与移动。例如 git log -L 42,42:path/to/file.ts 查看单行,git log -L 10,20:path/to/file.ts 查看行范围,git log -L :functionName:path/to/file.ts 查看函数,加 --oneline 只显示哈希与信息;git show <hash> 可完整阅读单次提交。由此找到变更背后的目标:先定位提交,再读其信息与 diff。
查看文件或目录的完整历史:git log --oneline -- path/to/file.ts;跨重命名需加 --follow(仅限单个文件);也可指定目录或加 -p、--stat。-- 分隔符标记路径起点,避免 Git 把文件名误当分支名。
分页读取大 diff:工具会截断长输出,可用 sed 按固定窗口、不重叠地分页,例如 git diff $BASE_REF...HEAD -U20 -- ':!*.lock' | sed -n '1,500p',随后 501,1000p,每 500 行继续直到输出为空;可先用 git diff --stat 看哪些文件重要。
限制与注意事项:--follow 仅适用于单个文件;若中止的 git 命令留下 .git/index.lock,需先用 pgrep -fl git 确认没有 git 或编辑器进程运行,才可执行 rm .git/index.lock,并以非交互方式重试(如 GIT_EDITOR=true git rebase --continue)。其余涉及具体会话读取的命令保留原文。