如何通过Git命令获取分支所有已提交及未提交的文件变更?
解决方案
一、移除git status输出的状态前缀
如果只想提取文件路径,去掉开头的状态标识(比如??),用文本过滤命令即可:
git status --porcelain -uall | sed 's/^.. //'
或者用awk实现同样效果:
git status --porcelain -uall | awk '{print substr($0,4)}'
这两个命令都会删掉输出开头的两个字符和后续空格,直接保留文件路径。
二、获取当前分支所有变更文件(含已提交、暂存、未暂存)
要达到类似Pull Request的展示效果,需要整合三类文件的查询结果,去重后得到完整的变更列表:
完整命令组合
{ # 当前分支相对于main已提交的所有变更文件 git diff --name-only main...HEAD # 暂存区待提交的文件 git diff --name-only --cached # 工作区未暂存的变更文件 git diff --name-only } | sort | uniq
各命令说明
git diff --name-only main...HEAD:查询当前分支与main分支的合并基础之后,所有已提交的变更文件,逻辑和PR展示的已提交内容一致。git diff --name-only --cached:列出已经add到暂存区、等待commit的文件。git diff --name-only:列出工作区中修改了但还没add的文件。sort | uniq:合并重复的文件路径(比如同一个文件可能既在已提交记录里,又被再次修改未暂存)。
可选:包含未跟踪文件
如果需要把git status里的未跟踪文件(即??开头的文件)也加进来,把过滤后的git status输出补充进去:
{ git diff --name-only main...HEAD git diff --name-only --cached git diff --name-only git status --porcelain -uall | sed 's/^.. //' } | sort | uniq
内容的提问来源于stack exchange,提问作者Student18
相关产品推荐
相关产品推荐

