如何检测未通过Pull Request直接提交至Master分支的Commit?
检测直接提交到Master分支的Commit
嘿,这个需求我太熟了!之前维护团队项目时,为了确保所有变更都走PR流程,经常要抓这种跳过PR直接推的“漏网之鱼”,给你几个简单好用的方法:
方法1:用GitHub CLI(最准确,适合GitHub项目)
如果你的项目托管在GitHub上,用官方的gh CLI工具可以直接精准定位:
- 先导出所有通过合并PR进入master的提交哈希:
gh pr list --state merged --json commits | jq -r '.[].commits[].oid' > pr-commits.txt - 导出master分支上的所有提交哈希:
git log master --pretty=format:"%H" > all-master-commits.txt - 对比两个文件,找出只在master但不在PR提交列表里的记录:
输出的哈希就是像c4这样直接提交到master的违规提交。comm -23 all-master-commits.txt pr-commits.txt
方法2:本地Git命令(无需平台CLI,依赖提交规范)
如果你的团队约定所有PR合并的提交(包括 squash 合并)都会在提交信息里带上PR编号(比如fix: 修复登录bug (#123)),那用一条Git命令就能搞定:
git log master --no-merges --grep="\(#\d\+\)" --invert-grep
这条命令会过滤掉:
- 合并提交(
--no-merges) - 提交信息里包含
#数字格式PR编号的提交
剩下的就是直接提交到master、没走PR流程的提交。
方法3:基于分支拓扑的本地检测
如果你的PR都是从feature/develop分支合并到master,且这些分支还没被删除,可以用这条命令找出所有不在任何feature/develop分支上的master提交:
git log master --not --remotes=origin/feature/* --not --remotes=origin/develop
不过这个方法的局限性是如果旧的feature分支已经被删除,就会漏检。
内容的提问来源于stack exchange,提问作者islegmar




