如何用git log/rev-list显示指定范围内所有路径共有的提交?
实现方法
Git没有直接的内置命令可以一键筛选出指定范围内所有路径都包含的提交,但可以通过组合命令或脚本实现需求。
核心思路
我们需要找出的是指定起点(如A)到终点(如AB2)的所有路径的必经提交(图论中的「关节点」),这类提交的特征是:一旦移除该提交,起点将无法到达终点。
具体实现
可以通过遍历范围内的所有提交,逐一验证该提交是否为必经点:
- 首先获取起点到终点的所有提交(包括起点和终点):
git rev-list --reverse A AB2
--reverse 是为了从起点A开始遍历到终点AB2,方便按顺序查看。
- 对每个提交,检查移除它后是否还存在从A到AB2的路径:
如果执行以下命令返回空,说明所有路径都必须经过该提交:
git rev-list --ancestry-path A..AB2 --not <commit>
- 整合为可执行脚本:
#!/bin/bash START=A END=AB2 for commit in $(git rev-list --reverse $START $END); do # 检查移除当前提交后,是否没有路径从START到END if [ -z "$(git rev-list --ancestry-path $START..$END --not $commit)" ]; then # 打印提交的简洁信息(可根据需求调整log参数,如添加--stat展示变更) git log -1 --oneline $commit fi done
针对示例的效果
运行上述脚本后,会输出:
<提交哈希> A <提交哈希> AB <提交哈希> AB2
正好符合需求,排除了仅存在于单一路径的A2、B、B2。
补充说明
--ancestry-path参数确保只显示起点和终点之间的「直系」路径提交,避免无关分支干扰。- 若只需输出提交哈希而非日志,可将
git log -1 --oneline $commit替换为echo $commit。
内容的提问来源于stack exchange,提问作者10101
相关产品推荐
相关产品推荐

