如何仅列出两次提交之间更改的文件名?


Answers:


2661
git diff --name-only SHA1 SHA2

您只需要包含足够的SHA即可识别提交。您也可以这样做,例如

git diff --name-only HEAD~10 HEAD~5

查看第十次提交和第五次提交(大约)之间的差异。


151
这也适用于git show。git show --name-only SHA1
8月Lilleaas,2009年

78
git diff --name-status [TAG|SHA1]显示了对文件也执行了哪些操作
reconbot 2011年

2
您也可以执行以下操作:git diff --name-only HEAD @ {3} HEAD @ {0}获取要比较的确切提交。
b01

7
@AugustLilleaas实际使用show只会显示2个特定的提交,如果您在这2个之间有提交,则将被忽略
chrisan 2012年

4
如下所述,git diff --name-status似乎并不想显示添加的文件。@sschuberth指出git show,这对我来说似乎确实可以正常工作: git show --pretty=format: --name-status。只是git show --name-status提供了更多信息,但仍然不错且密集...这将是我的新goto命令;)
travc

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

就像--name-only一样,只不过您得到一个简单的前缀来告诉您文件发生了什么(修改,删除,添加...)。

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

与之类似,但是在提交消息之后列出了提交,因此您可以查看文件的更改时间。

  • 如果您只对某些文件/文件夹的内容感兴趣,可以将其附加-- <filename> [<filename>...]git log版本中。

  • 如果您想查看一次提交的结果,将其命名为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 2014年

有什么方法可以排除某些文件/某些文件类型?
2014年8

3
--relative[=<path>]我不确定,该选项可能会对您有所帮助。否则总会有| erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot 2014年

80

似乎没有人提到此开关--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(-)

4
可接受的答案是正确的,但这非常有用,并为您提供了一些额外的信息。谢谢!
kontur

2
同意这是一个更有用的答案,因为它包含diff统计信息。
internetross

52

但是要查看文件在分支和它的共同祖先与另一个分支之间发生了变化(例如起源/母版):

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 2014年

您可能无法将其设为git别名,但可以将其放入.bashrc中。
弗雷德(Fred)

3
或更简单:(git diff --name-only HEAD...master请注意三个点)。有关详细说明,请参见此处
ostrokach '16

1
看起来基本上是正确的答案!简单git diff --name-only master..branch与github PR列表不对应。这样更精确。但是无论如何,我在github PR中有173个chaned文件,而171个。(merge-base我没有228 vs 171)
x'ES

21

如果要显示两个分支之间的更改文件,请补充@artfulrobot的答案:

git diff --name-status mybranch..myotherbranch

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

添加一个grep可以进一步完善的事情:

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

然后将仅显示添加到中的文件myotherbranch


4
正则表达式很不错,几乎可以做任何事情。不过,在这种情况下,还可以--diff-filter通过本机提供此功能,这意味着错误结果(例如误报)的可能性较小
Jasper 2015年

8

在您的别名下面添加别名~/.bash_profile,然后运行source ~/.bash_profile;现在,您需要在showfilesgit存储库中的最后一次提交,运行中随时查看更新的文件。

alias showfiles='git show --pretty="format:" --name-only'

2
还是git config --global alias.showfiles 'show --pretty="format:" --name-only'git showfiles
cgmb


5

另请注意,如果您只想查看上一次提交和上一次提交之间的更改文件。这工作正常:git show --name-only


3

使用git log --pretty = oneline> C:\ filename.log

这将仅记录一个单行(--pretty = oneline),即已更改文件的名称。也将所有详细信息记录到您的输出文件中。


git log --pretty=oneline只给我SHA和使用git 2.10.1的提交消息
damd 2016年

3

正如artfulrobot在回答中所说:

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

我的例子:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png

3

对于只需要专注于Java文件的人,这是我的解决方案:

 git diff --name-status SHA1 SHA2 | grep '\.java$'

1

以下对我来说很有效:

$ git show --name-only --format=tformat: SHA1..SHA2

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

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

这在Jenkins中很方便,在Jenkins中,您可以找到一个changeSet SHA列表,并希望对其进行迭代以查看已更改的文件。

这类似于上面的几个答案,但是使用tformat:而不是format:删除提交之间的分隔符空间。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.