Git Blame显示合并者而非原作者?如何追溯代码实际编写者
哈哈,这个场景我太熟悉了——帮同事合并完PR,结果git blame一看,所有代码都变成自己写的了,简直冤得慌!别着急,咱们分情况来解决:
先搞懂为什么会这样
首先得明确你用的是哪种PR合并方式:
- 如果是普通合并(包括带
--no-ff的非快进合并):合并提交本身只是把两个分支“粘”在一起,没有修改代码内容,只是git blame默认会优先追踪合并提交的路径,所以显示你这个合并者。 - 如果是squash merge(压缩合并):这会把同事分支上的所有提交压缩成一个全新的提交,默认这个新提交的作者就是你,所以所有代码的blame自然指向你。
对应解决方案
情况1:用了普通合并(没压缩)
这种情况最简单,只需要让git blame跳过合并提交就行:
临时忽略单个合并提交:
先通过git log --merges找到那个合并提交的哈希值,然后运行:git blame --ignore-rev <合并提交哈希> 你的文件名这下就能看到实际写代码的同事啦。
长期自动忽略所有合并提交:
- 在仓库根目录新建一个
.git-blame-ignore-revs文件,把需要忽略的合并提交哈希每行一个写进去:abc1234567890abcdef1234567890abcdef12345 def0987654321fedcba0987654321fedcba09876 - 配置Git默认使用这个文件:
git config blame.ignoreRevsFile .git-blame-ignore-revs
之后再跑
git blame 你的文件名,就会自动跳过这些合并提交,直接显示原始作者了。- 在仓库根目录新建一个
情况2:用了压缩合并
这种情况比较麻烦,因为压缩后的提交已经把原始提交的作者信息覆盖了,分两种情况处理:
如果还没推送到远程仓库(或者可以强制推送,且团队同意)
赶紧撤销这次合并,重新用正确的方式合并:
- 撤销合并提交:
git reset --hard HEAD~1 - 重新合并,保留原始提交历史:
要么用非快进合并:
要么用rebase合并(会把同事的提交放到主分支最新提交之后,历史更线性):git merge --no-ff 同事的feature分支git checkout 同事的feature分支 git rebase main git checkout main git merge 同事的feature分支
已经推送到远程,且团队已经拉取了这个版本
这时候强制推送容易出问题,建议用情况1里的忽略合并提交方法,把这个压缩合并的提交加到.git-blame-ignore-revs里,让git blame跳过它。同时记得和团队约定,后续PR合并尽量不用squash merge(除非是小改动且不需要保留提交历史)。
后续预防措施
为了避免再踩这个坑,建议团队统一合并PR的方式:
- 优先用普通非快进合并或rebase合并,这两种方式都会保留原始提交的作者信息,
git blame能正确追踪到实际编写者。 - 如果一定要用squash merge,记得在合并时修改提交的作者信息为实际编写代码的同事(Bitbucket在squash合并时可以选择保留原始作者,或者手动修改提交信息)。
内容的提问来源于stack exchange,提问作者ntg
相关产品推荐
相关产品推荐

