如何列出在两次提交之间更改的文件名称。

2655

我在代码库中有一堆提交记录,我想查看两个提交记录间修改的文件列表 —— 从 SHA1SHA2

我应该使用什么命令?

答案:您可以使用以下命令来查看两个提交记录间修改的文件列表:
git diff --name-only SHA1 SHA2

3
针对一个提交及其父提交:https://dev59.com/PHRC5IYBdhLWcg3wD8xV - Ciro Santilli OurBigBook.com
1
你应该修改问题标题...你不想列出已更改的文件名...你想要列出已更改的文件的名称。请注意,更改文件名而不更改其内容是可能的。 - Max Waterman
15个回答

3533
git diff --name-only SHA1 SHA2

您只需要包含足够的SHA哈希来识别提交。SHA的顺序并不重要。输出(包括相对路径,而不仅仅是文件名)遵循以下格式:
 dir 1/dir 2/filename.ext
 dir 3/dir 4/other filename.ext

您也可以做,例如
git diff --name-only HEAD~10 HEAD~5

查看第十个最新的提交和第五个最新的提交之间的差异(或者如此)。


190
这个也适用于git show命令。使用git show --name-only SHA1 - August Lilleaas
112
git diff --name-status [TAG|SHA1] 显示了对文件进行的操作。 - reconbot
2
你还可以执行以下命令来获取你想要比较的确切提交:git diff --name-only HEAD@{3} HEAD@{0} - b01
10
实际上,使用 show 命令只会显示这两个特定的提交记录,如果在这两个提交记录之间有其他的提交记录,它们将被省略。 - chrisan
4
如下所述,git diff --name-status似乎不会显示已添加的文件。@sschuberth指出了git show,这对我来说确实有效:git show --pretty=format: --name-status。只是运行git show --name-status可以提供更多信息,但仍然简洁明了…… 这将成为我的新常用命令 ;) - travc
显示剩余9条评论

579
git diff --name-status [SHA1 [SHA2]]

git diff --name-status类似于--name-only,但是它会在文件名前面添加一个简单的前缀,告诉您文件发生了什么变化(修改、删除、添加...)

git log --name-status --oneline [SHA1..SHA2]

Git的git log命令和Unix的less命令类似,但是提交记录是按照提交信息列出来的,所以你可以看到文件的修改时间。

  • 如果您只关心某些文件/文件夹发生了什么,可以在git log版本后附加--<filename> [<filename>...]

  • 如果您想查看单个提交记录发生了什么,请调用它的SHA1,然后执行
    git log --name-status --oneline [SHA1^..SHA1]

文件状态标志:

标志 名称 含义
M 修改 文件已被修改
C 复制编辑 文件已被复制并修改
R 重命名编辑 文件已被重命名并修改
A 添加 文件已被添加
D 删除 文件已被删除
U 未合并 文件在合并后存在冲突

我刚好运行了 git diff --name-status 命令,它确实显示了“添加的文件”。 - aartist
1
对于 git log,需要在两个 SHA 之间加上两个点,例如 SHA1..SHA2,第二个 SHA 是必须的,所以应该像这样:git log --name-status --oneline [SHA1..SHA2]。 - twasbrillig
3
--relative[=<path>] 选项可能会有帮助,但我不确定。否则,总是可以使用 | erep -v '(.tmp|.foo|.dontwant)$'... - artfulrobot
1
@artfulrobot 你是不是指的是egrep - David Moles
1
@DavidMoles 是的,我看到了,但是现在我无法编辑评论! - artfulrobot
显示剩余2条评论

156

看起来没有人提到开关--stat

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

还有 --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

并且使用 --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)

18
接受的答案是正确的,但这个信息非常有用,可以让你获得额外的一点信息。谢谢! - kontur
3
同意这是更有用的答案,因为它包含了不同的统计数据。 - internetross

79

如果要查看你的分支与另一个分支(比如origin/master)的共同祖先之间有哪些文件发生了变化:

git diff --name-only `git merge-base origin/master HEAD`

1
这真的很有用!我希望我只需说“git diffstatus master”或类似的话,就能触发上述操作。 - oma
3
或者 git show --pretty=format: --name-only origin/master.. - sschuberth
你可能无法将它作为Git别名,但你肯定可以将它放入你的.bashrc文件中。 - Fred
6
甚至更简单:git diff --name-only HEAD...master(注意三个点)。详细解释请参见这里 - ostrokach
2
看起来大部分是正确的答案!简单的 git diff --name-only master..branch 不对应 Github PR 列表。这种方式更精确。但无论如何,我的修改文件有173个,而 Github PR 中只有171个。(没有使用 merge-base 的情况下,我的修改文件有228个,而 Github PR 中只有171个) - x'ES
你可以使用git命令的--merge-base选项来实现相同的结果,而无需执行两个命令,像这样:git diff --name-only --merge-base origin/master。来源:https://git-scm.com/docs/git-diff - AnythingIsFine

37
每个之前的回答中最大的问题是你被输入到一个分页器中,如果你想使用从存储库中获取的信息,这会非常烦人。 特别是如果你是一个开发者,宁愿学习你应该开发的应用程序的业务逻辑,而不是学习vim命令。
使用--no-pager解决了这个问题。
git --no-pager diff --name-only sha1 sha2

2
--no-pager 是非常关键的。感谢你的突出表现。 - Will Huang
1
--no-pager 选项的另一种替代方法是直接使用管道符号 | 并将输出传递给 cat 命令(尽管这样会失去颜色):git diff --name-only sha1 sha2 | cat - Andre M
在git配置中设置一次即可:core.pager=less -+X -F - 短输出将显示在控制台中,长输出(需要滚动)将显示在分页器中,非常必要。 - bloody

33
为了补充@artfulrobot的回答,如果你想显示两个分支之间的更改文件:
git diff --name-status mybranch..myotherbranch

注意优先级。如果您首先放置较新的分支,则会显示文件已删除而不是已添加。

使用grep可以进一步细化:

git diff --name-status mybranch..myotherbranch | grep "A\t"

那么就只会显示在 myotherbranch 分支中添加的文件。


6
正则表达式很棒,确实几乎可以做任何事情。但在这种情况下,还有一个名为--diff-filter的原生功能已经提供了此功能,这意味着减少了错误结果(例如误报)的机会。 - Jasper
如果文件名中包含“A\t”,则此方法无效。您需要使用“grep "^A\t"”。 - phuclv

20

另外请注意,如果你只想查看最后一次提交和上一次提交之间的更改文件,那么可以这样做:

git show --name-only

1
简单易记的内容应该得到更多的赞。 - Kerem atam

11
将以下别名添加到您的~/.bash_profile文件中,然后运行source ~/.bash_profile。现在,每当您需要查看最后一次提交中更新的文件时,请从您的git存储库运行showfiles
alias showfiles='git show --pretty="format:" --name-only'

3
输入 git config --global alias.showfiles 'show --pretty="format:" --name-only' 可以创建一个名为 git showfiles 的 Git 别名,并使其显示仅文件名,格式为 --pretty="format:" --name-only - cgmb

9
以下对我很有效:
git show --name-only --format=tformat: SHA1..SHA2

它也可以与单个提交一起使用:

git show --name-only --format=tformat: SHA1

这对于在Jenkins中使用非常方便,因为你会得到一个变更集SHA哈希值的列表,并且想要迭代它们以查看哪些文件已被更改。
这与之前的一些答案类似,但是使用tformat:而不是format:可以去除提交之间的分隔空格。

7
这将显示文件更改的内容:
git diff --word-diff SHA1 SHA2

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