Git blame显示的作者不是修改者,怎么回事? 开发者茜茜 提问于 2026-02-06 15:27:24 阅读 101 工具 我在合并分支后用git blame查看某行代码的作者,显示的是合并者而不是实际修改者。之前在feature分支改过这个文件,合并到主分支后现在用git blame -L 10,20 filename看结果全显示合并提交的作者信息。 试过加参数--ignore-rev和--ignore-date都没用,该怎么追溯到具体修改代码的人呢?是不是和合并方式有关? 协作开发 我来解答 赞 16 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 闲人芯依 Lv1 你遇到的这个问题其实挺常见的,根本原因在于 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 上官景源 Lv1 这问题我之前也踩过。你用的是 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 加载更多 相关推荐 2 回答 97 浏览 Git Blame显示的提交ID和实际修改者不符怎么办? 在合并分支后用git blame查看某行代码时,显示的总是合并提交的ID,而不是真正修改代码的人。我尝试过加--show-root参数也没用,该怎么准确定位原始作者? 比如我修改过组件的prop验证逻... 丽萍 工具 2026-01-27 16:33:31 2 回答 57 浏览 Git Blame 为什么显示的不是我修改的那行代码? 我用 git blame 查看某行代码是谁改的,结果发现显示的是几个月前的提交,但明明是我昨天重构时改过这行啊?是不是因为 rebase 或者合并导致历史记录混乱了? 比如这段 React 组件里的逻... 开发者永香 工具 2026-03-16 18:44:22 2 回答 96 浏览 Git Blame显示某行代码被多人修改过,但只显示最后一次提交者怎么办? 在用Git Blame检查一个配置文件时,发现某行代码实际被三个人修改过,但运行git blame filename只显示最后一次提交的用户名。之前两次修改者的记录完全没显示,该怎么查更早的修改者呢?... Tr° 子皓 工具 2026-02-07 03:22:24 1 回答 138 浏览 Git打标签后怎么推送到远程仓库? 我本地用 git tag v1.2.0 打了个标签,但在 GitHub 上没看到,是不是还要单独推送?之前只推过分支,没推过标签,有点懵。 我试过 git push origin main,但标签还是... 百里浩然 工具 2026-03-15 09:14:25 2 回答 20 浏览 Git Bisect 怎么用?我试了但找不到引入 bug 的提交 我在用 Git Bisect 排查一个 UI 显示异常的问题,但跑完流程后它标出的“坏提交”根本没改过相关代码,感觉不对劲。我是不是哪里操作错了? 我怀疑是某个提交不小心删了 class 名,比如下面... 闲人超霞 工具 2026-03-02 16:55:21 2 回答 148 浏览 为什么每次提交React组件代码后,Git总是显示我删除了所有空格? 大家好,我最近在用React开发页面时遇到个怪问题。每次提交修改后的组件代码,Git都显示我删除了大量空格,但代码实际功能没问题,视觉效果也没变化。 比如这个按钮组件: function MyButt... UX-慧青 前端 2026-01-30 07:56:33 1 回答 50 浏览 Git pre-commit hook 不生效是怎么回事? 我按照教程在项目根目录的 .git/hooks/pre-commit 里写了脚本,也加了执行权限(chmod +x),但每次 commit 都直接跳过了,根本没运行。是不是路径放错了?还是 Git 版... 极客璐莹 工具 2026-03-27 08:21:16 1 回答 36 浏览 GitHub Actions部署时环境变量没生效怎么办? 我用 GitHub Actions 自动部署 React 项目到服务器,明明在 secrets 里设置了 REACT_APP_API_URL,但构建后还是 undefined,本地 .env 文件能正... IT人文华 工具 2026-03-22 19:06:23 1 回答 35 浏览 Jira提交信息关联不到Git分支怎么办? 我们团队用Jira管理任务,也配了Git集成,但每次push代码时写了Jira ticket号(比如PROJ-123),在Jira里却看不到对应的commit记录,分支也没自动关联上。是不是commi... IT人晓莉 工具 2026-03-21 19:34:21 1 回答 41 浏览 Git 切换分支时提示有未提交的更改怎么办? 我正在开发一个新功能,刚改了几行代码还没 commit,想切回 main 分支看个东西,结果 Git 报错不让切,说本地有修改会覆盖。 我试过 git stash 但好像没生效,还是切不过去,现在卡在... 清梅的笔记 工具 2026-03-21 17:11:22
你用
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 才能顺藤摸瓜找到人。根本原因是 merge 提交本身不记录文件修改内容,它只是把两个分支的差异合并在一起。这时候 blame 会追踪到 merge 提交的作者,而不是原始修改的那个人。
解决办法是加一个参数:
git blame -M,这个参数会让 git blame 追踪文件重写(比如 merge 产生的改动),从而显示真正的修改者。你试试:如果还是不行,那可能是你的 git 版本太老,-M 参数在某些旧版本支持不全。升级一下 git 再试试。
另外,如果你是用 rebase 合并进主分支的,那问题就更简单了,rebase 会保留原始提交的 author,blame 就不会出错。
以后做 merge 的时候记得加上 -M,不然真找不回原来的作者。这种坑踩一次就够了。