如何在git中找到从一个提交到另一个提交更改的文件数量

54

我正在处理一个包含大量文件的git存储库,想要提取两个提交之间文件变更的数量,应该如何操作。


也许是 git whatchanged - Kerrek SB
1
@Kerrek SB 看起来是个好答案。为什么你把它放在评论里而不是回答中?对不起,有时我就是不明白。 - SteeveDroz
@Oltarus:好的,已完成 :-) 似乎不够重要需要回答,而且我也不确定它是否真正满足需求。不过在查看了一些文档后,似乎它确实可以! - Kerrek SB
对于使用较新的git版本的访问者,以下命令大致上会给你提供OP所需的信息: git show --oneline --name-only commit_hash_a..commit_hash_b 当然,这个命令将会打印出提交信息以及文件列表。但是,对于简单的用例已经足够好了。 - sdevikar
5个回答

77

编辑:根据c00kiemon5ter的提醒,“--format=oneline”选项包含了提交哈希和标题,因此这将始终计算文件数加一。


git whatchanged工具会显示出被修改的文件的摘要。默认情况下会列出所有的提交记录,但你也可以限制只列出最近n次提交记录:

git whatchanged -1
计算文件数量:
git whatchanged -1 --format=oneline | wc -l

详见此处,了解更多信息请参考git help whatchanged


8
请注意,这将始终计算文件数加一,因为 --format=oneline 包括提交哈希 / 标题。 - c00kiemon5ter
1
git whatchanged -1 --format=oneline | tail -n +2 | wc -l - Bobby Jack
5
“git-whatchanged命令主要出于历史原因而保留。”“建议新用户使用git-log(1)代替。” - Stéphane Gourichon
9
@StéphaneGourichon: 这个回答主要是为了历史原因而保留的。我们鼓励新用户寻找其他答案 :-) - Kerrek SB
由于 OP 似乎询问了所有提交的更改文件数量,而不仅仅是一个,因此以下答案似乎很合适:https://dev59.com/OGEi5IYBdhLWcg3wltIl#40777727 - ob-ivan

31
除了上述列出的方法之外,你也可以使用以下方法: git diff HEAD^..HEAD --name-only - 将会列出在HEAD和比HEAD^早一个版本的文件改动列表。你可以将HEAD^替换为"from"提交的SHA1值,将HEAD替换为"to"提交的SHA1值: git diff <SHA1-of-from-commit>..<SHA1-of-to-commit> --name-only 因此,如果你将输出导入到 wc -l 中,它会显示提交之间更改文件的数量。

1
更有用的是能够计算任意提交之间的文件数量——而不仅仅是在单个提交中更改的文件。请注意,它也适用于分支名称和标签(当然还有其他提交缩写,除了HEAD和HEAD^)。 - Stan Kurdziel
这个命令绝对能帮到你,当你需要查找自己分支与主干之间文件的总变更数时,请尝试输入 git diff master..HEAD - TbWill4321
我想要计算两个分支之间更改的文件数量。这是最有帮助的答案。我最终使用的命令是 git diff master..HEAD --name-only --oneline --stat | wc -l - dx_over_dt

25
git show --stat

这将给出类似以下的文件更改列表:

1个文件已更改,1个插入(+), 1个删除(-)

如果您不想从最新版本获取信息,可以选择添加提交代码。

git show --stat {commit code without brackets}

4
使用 --shortstat 以简明扼要的方式查看提交信息:git show --shortstat <哈希值>。请访问 https://git-scm.com/docs/git-show 获取更多选项。 - Nolan Amy

14

使用以下方法:

git log --oneline --name-status <HASH> -1

例如:

$ git log --oneline --name-status bb3ae49 -1
M       .vim/spell/en.utf-8.add
M       .vim/spell/en.utf-8.add.spl

这个功能的工作方式类似于

git whatchanged --oneline --name-status <HASH> -1

1
这应该是被接受的答案,因为不鼓励使用 git whatchanged - Sean the Bean

2

在Windows中:

git whatchanged -1 --format=oneline | find /v /c ""

重要的是,你必须将其他解决方案中使用的 wc 命令替换为以下命令:

  | find /v /c ""

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