Git blame显示的作者不是修改者,怎么回事?

开发者茜茜 阅读 101

我在合并分支后用git blame查看某行代码的作者,显示的是合并者而不是实际修改者。之前在feature分支改过这个文件,合并到主分支后现在用git blame -L 10,20 filename看结果全显示合并提交的作者信息。

试过加参数--ignore-rev--ignore-date都没用,该怎么追溯到具体修改代码的人呢?是不是和合并方式有关?

我来解答 赞 16 收藏
二维码
手机扫码查看
2 条解答
闲人芯依
你遇到的这个问题其实挺常见的,根本原因在于 Git 的 blame 是按提交来追踪的,而合并提交(merge commit)本身会引入整段变更,导致 blame 把整块代码都归到合并者头上。

你用 git blame -L 10,20 filename 看到的是合并提交的信息,不是因为参数没用,而是因为 Git 默认不会继续往合并前的历史里挖——它看到这行代码是在合并提交里“一次性引入”的,就停那儿了。

解决办法有两个:

第一个,用 git blame -M -L 10,20 filename 加上 -M 参数,这个参数会让 Git 尝试追踪“移动/复制”的代码行,有时候能绕过合并提交往里挖。不过如果合并用的是 squash 或者 rebase,可能效果有限。

第二个更靠谱的:用 git log -L 10,20:filename 先看看这行代码的完整变更历史,从提交信息里找具体修改过的 commit,再用 git show :filename 对比。虽然慢点,但准。

如果你用的是 GitHub 或 GitLab,网页上 blame 页面默认也会有“原作者”信息,它底层其实调了 git log --follow -L 这种更激进的方式,但本地命令得自己加参数。

对了,你试过 --ignore-rev 但没用,是因为那个参数是跳过某个提交,不是跳过合并提交本身。真要绕过合并提交,得用 git blame --first-parent -L 10,20 filename,这个参数会忽略合并提交的非主干变更,强制往主干分支的历史里查。

不过最保险的还是:以后合并 feature 分支时,尽量用 git merge --no-ff 保留真实提交链,或者避免 squash merge,这样 blame 才能顺藤摸瓜找到人。
点赞 6
2026-02-27 16:14
上官景源
这问题我之前也踩过。你用的是 merge 合并分支吧?git blame 默认会穿透 merge 提交,但某些情况会显示合并者的 commit 信息,而不是原始修改者。

根本原因是 merge 提交本身不记录文件修改内容,它只是把两个分支的差异合并在一起。这时候 blame 会追踪到 merge 提交的作者,而不是原始修改的那个人。

解决办法是加一个参数:git blame -M,这个参数会让 git blame 追踪文件重写(比如 merge 产生的改动),从而显示真正的修改者。你试试:

git blame -M -L 10,20 filename


如果还是不行,那可能是你的 git 版本太老,-M 参数在某些旧版本支持不全。升级一下 git 再试试。

另外,如果你是用 rebase 合并进主分支的,那问题就更简单了,rebase 会保留原始提交的 author,blame 就不会出错。

以后做 merge 的时候记得加上 -M,不然真找不回原来的作者。这种坑踩一次就够了。
点赞 12
2026-02-06 15:30