Git:只看某个文件的提交记录,用 `git log -- path` 很直接

37 次浏览5 条回复

有时候不是想翻整个仓库历史,只想知道某个文件最近是谁改过、改了哪几次。这个场景直接把路径放到 -- 后面就行。

环境:Git 2.30+。可以在空目录里试一下:

mkdir git-file-log-demo && cd git-file-log-demo
git init
printf 'v1\n' > note.txt
git add note.txt
git commit -m 'init note'

printf 'v2\n' >> note.txt
git add note.txt
git commit -m 'update note'

printf 'other\n' > other.txt
git add other.txt
git commit -m 'add other'

git log --oneline -- note.txt

最后那条 add other 不会出现在结果里,因为它没碰 note.txt。

路径前面的 -- 主要是把“参数”和“文件路径”隔开,文件名刚好像分支名或参数时会少点歧义。平时排查某个配置文件、脚本、迁移文件的变动,我觉得这个比先开图形工具更快一点。

这个用来追配置文件挺舒服。想顺手看每次到底改了什么,可以加 -p:

git log -p -- note.txt

如果文件中途改过名,可能还要试试 --follow,不过它一次只能比较适合跟一个路径。

还有个小搭配我也挺常用:只想先扫一眼改动密度,可以加 --stat,比直接看 patch 轻一点。

git log --stat -- note.txt

如果只是想确认某几次提交碰过哪些文件,再把路径去掉看对应 commit 会更清楚。

排查最近改动时还可以顺手加个时间范围,结果会干净不少:

git log --oneline --since='2 weeks ago' -- note.txt

环境还是 Git 2.30+ 就行。比起先翻一大串历史,先缩小到最近一段时间通常更快。

如果是在找某一行是谁改的,git blame 也可以和这个配着用:

git blame -- note.txt

先用 git log -- note.txt 缩范围,再对可疑位置 blame,一般比直接全文件盯着看轻松点。

我会再补一个 --name-only,有时候先看哪些提交碰过这个文件,再顺手确认那次提交还改了哪些文件:

git log --name-only --oneline -- note.txt

如果看到某个 commit 可疑,再 git show <commit> -- note.txt 单独展开,会比一开始就全量看 patch 清爽一点。