如何列出指定基准Commit后所有分支中新增/修改的文件
查找指定基准提交后各分支新增/修改的文件
可以通过Git命令结合Shell脚本实现需求,以下是具体方案:
核心命令
将<BASE_COMMIT>替换为你的基准提交(标签、哈希值或分支名),执行以下命令:
echo "hash branch file" echo "---- ------ ----" git for-each-ref --format='%(refname:short)' refs/heads/ | while read branch; do git log --no-merges --pretty=format:"%h $branch" --name-only <BASE_COMMIT>..$branch | awk 'NF {if ($0 ~ /^[0-9a-f]{7}$/) hash=$0; else print hash, "'$branch'", $0}' done | column -t
命令说明
git for-each-ref --format='%(refname:short)' refs/heads/:遍历所有本地分支,输出简洁分支名git log --no-merges --pretty=format:"%h $branch" --name-only <BASE_COMMIT>..$branch:筛选该分支中在基准提交之后的非合并提交,输出提交短哈希、分支名及对应修改/新增的文件awk:处理Git日志输出,将提交哈希与对应的文件关联匹配column -t:自动对齐列,让输出格式更接近需求样式
适配场景调整
- 包含远程分支:将
refs/heads/替换为refs/remotes/,注意远程分支会带有origin/前缀 - 包含合并提交:去掉命令中的
--no-merges参数 - 处理含空格的文件路径:如果文件路径包含空格,可改用制表符分隔输出避免错位,命令如下:
echo -e "hash\tbranch\tfile" echo -e "----\t------\t----" git for-each-ref --format='%(refname:short)' refs/heads/ | while read branch; do git log --no-merges --pretty=format:"%h\t$branch" --name-only <BASE_COMMIT>..$branch | awk 'BEGIN {FS="\t"} NF {if ($1 ~ /^[0-9a-f]{7}$/) {hash=$1; current_branch=$2} else {print hash "\t" current_branch "\t" $0}}' done
内容的提问来源于stack exchange,提问作者Adamarla
相关产品推荐
相关产品推荐

