如何列出某个提交包含(改动)的所有文件
列出提交涉及的文件:git show --name-only --oneline <哈希>,或脚本友好的 git diff-tree --no-commit-id --name-only -r <哈希>。带增删改状态用 --name-status,看统计用 --stat。
给人看用 git show --stat <提交哈希>(文件清单+改动统计);脚本里用 git diff-tree --no-commit-id --name-only -r <哈希>——纯净的文件路径列表,一行一个,方便管道处理。
命令对比
git show --name-only --oneline a1b2c3d # 提交信息 + 文件清单
git show --stat a1b2c3d # 文件清单 + 增删行数
git show --name-status a1b2c3d # 带状态:A新增 M修改 D删除
git diff-tree --no-commit-id --name-only -r a1b2c3d # 纯净路径列表
脚本中遍历
for f in $(git diff-tree --no-commit-id --name-only -r a1b2c3d); do
echo "处理 $f"
done
# 筛选只删除的文件
git diff-tree --no-commit-id --name-status -r a1b2c3d | grep '^D'
看工作区/暂存区的文件
git status --short # 当前未提交的变更文件
git diff --name-only # 工作区改动的文件
git diff --cached --name-only # 已暂存的文件
常见问题(FAQ)
Q:merge 提交用这些命令为什么没输出?
merge 提交相对两个父提交的组合 diff 默认不展开。用 git show --first-parent --name-only <合并提交> 或 git diff <合并提交>^1 <合并提交> --name-only 显式对比主线父提交。
Q:想连文件内容一起看?
git show a1b2c3d(不加 --name-only)输出完整 diff。
Q:如何导出某提交的所有文件(打包)?
git archive -o files.zip a1b2c3d 打整个快照;只打改动文件:git diff-tree ... | zip archive.zip -@。