Git:显示所有已修改的文件 - 已暂存和未暂存

13

我需要一个命令,可以给我所有修改过的文件 - 这包括已暂存(即新添加的文件)和未暂存的更改 - 以简单列表的形式提供,这样我就可以在脚本中使用它。虽然这个问题可能听起来很熟悉,但我只能找到接近我想要做的命令:

git ls-files -m

..列出(未暂存)的修改,但忽略已暂存和新添加的文件

git diff --name-only

..也仅列出未暂存的修改

git diff --name-only --cached

... 列出 只是已暂存的 修改,但省略了具有未暂存修改的文件。

git status --porcelain --untracked-files=no

.. 输出我想要看的所有文件,但是添加了状态

当然我可以使用 git status 然后使用 cut 命令的第一个条目,但由于我想将此命令集成到将在Windows上使用的CMake脚本中,因此一个单一的命令就足够了。


4
获取列表需要执行两个git diff命令(就是你已经找到的那两个)。git status命令在内部运行了两个git diff。请注意,文件foo可能会被修改并暂存,然后再次修改但未暂存。(这种情况下,git status将其显示为MM。) - torek
看起来我可以像在我的答案中写的那样明确地与HEAD进行差异比较 - 这种方法有问题吗? - frans
git diff HEAD 比较 HEAD(当前提交)与工作树:它会忽略已经暂存,然后修改回匹配 HEAD 提交的文件。例如,在 foo 中添加一行,git add 结果,然后删除添加的行。 - torek
1个回答

12
git diff --name-only HEAD

看起来就是我想要的,但我还不确定。如果有人能详细解释一下,我会采纳他/她的回答:)


4
这将把你的工作区与你的HEAD状态进行比较。它可能与你在提问时所想的不同。这种差异是由于你修改了一个文件,将其暂存,然后撤销了工作区中的更改所导致的。你希望如何处理这种情况? - Leon
我尝试使用“-z”选项使输出在一行上,以便可以将其管道传输到tar中,但是它在每个文件之间显示“^@”-- 有人知道如何用空格替换它吗? - thdoan
@thdoan 或许可以这样做?$ git diff --name-only HEAD | paste -sd " " - Chai Ang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接