如何查找合并提交中引入的指定字符串?Git log -S失效问题
如何查找合并提交中引入的特定字符串?
默认的git log -S无法检测到合并提交中引入的字符串,而git log -m -p速度过慢,需要更高效的解决办法。
问题复现步骤
git init -b a touch init git add init git commit -m init echo a > init git commit -am a git switch -c b HEAD~ echo b > init git commit -am b git merge a # 此处会因冲突失败 echo ab > init git commit -a --no-edit
提交日志
λ git log --graph --oneline * c65b4ce (HEAD -> b) Merge branch 'a' into b |\ | * 59d5818 (a) a * | 0967c4b b |/ * 40fac69 init
现有测试结果
使用git log -S可以找到普通提交中的字符串:
λ git log --oneline -S a 59d5818 a λ git log --oneline -S b 0967c4b b
预期结果
执行git log --oneline -S ab时,应返回合并提交:
λ git log --oneline -S ab c65b4ce Merge branch 'a' into b
实际结果
执行后无任何输出:
λ git log --oneline -S ab # 无输出
解决方案
方法1:添加-m参数让Git分析合并提交差异
Git默认跳过合并提交的差异分析,加上-m参数后,Git会将合并拆分为与每个父提交的对比,此时-S就能扫描到合并中引入的字符串:
git log --oneline -m -S"ab"
执行后即可得到预期输出:
c65b4ce Merge branch 'a' into b
方法2:配合--first-parent提升效率
如果只关心合并提交相对于当前分支(第一个父提交)的变更,可以加上--first-parent,减少不必要的差异分析,提升速度:
git log --oneline -m --first-parent -S"ab"
原理说明
-m参数会让Git将每个合并提交处理为多个虚拟提交,分别与每个父提交做差异对比,这样-S(字符串搜索)就能扫描这些差异内容,找到引入目标字符串的合并提交。默认情况下Git不分析合并提交的差异,因此-S无法生效。
内容的提问来源于stack exchange,提问作者Weihang Jian
相关产品推荐
相关产品推荐

