如何通过Git blame查找多行代码块的引入提交?
如何查找多行代码块的引入提交?
Git blame仅能定位单行代码的最初引入提交,无法直接识别多行代码组合在一起的那个提交——就像你遇到的场景:
- Commit 1 引入了包含
"context1"的pgettext调用 - Commit 2 引入了包含
"msgid2"的pgettext调用 - Commit 3 移除原有两个调用,将
"context1"和"msgid2"组合成新的调用
用git blame查看时,两行分别归属Commit 1和Commit 2,但你需要找到把这两行组合起来的Commit 3,可通过以下方法实现:
方法1:使用git log -G(正则匹配内容变更)
git log -G可以搜索代码中内容匹配正则表达式的变更提交,刚好适合查找多行组合的引入场景。针对你的目标代码块:
"context1", "msgid2"
执行以下命令:
git log -G'\s*"context1",\n\s*"msgid2"'
这个正则会匹配包含"context1",(允许前导空格)后跟换行,再跟"msgid2"(允许前导空格)的代码变更,能精准定位到Commit 3——因为只有这次提交把这两行组合在了一起。
注:
-G和-S的区别:-S统计字符串出现次数的变化,-G匹配内容的变更,对于多行组合的场景,-G更精准。
方法2:结合git blame和git log回溯
如果-G的正则不好编写,也可以先通过git blame拿到两行各自的提交哈希,再查找同时涉及这两行修改的提交:
- 用
git blame获取两行的提交哈希,比如Commit 1的哈希是abc123,Commit 2的是def456 - 执行命令筛选关联这两个提交的后续变更:
git log --grep="abc123\|def456"
不过这种方法可能返回无关提交,需要手动筛选出组合两行的Commit 3。
方法3:逐版本对比差异
从当前提交往前,用git diff逐版本对比代码变化,比如:
git diff HEAD~1 HEAD git diff HEAD~2 HEAD~1
直到找到修改了这两行组合的提交,这种方法效率较低,适合提交数量不多的场景。
内容的提问来源于stack exchange,提问作者SAKAMOTO Noriaki
相关产品推荐
相关产品推荐

