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

How to list only the file names that changed between two commits?

我在回购中有很多承诺。我希望看到在两次提交之间更改的文件列表-从sha1到sha2。

我应该使用什么命令?


1
git diff --name-only SHA1 SHA2

您只需要包含足够的sha来标识提交。例如,您也可以这样做

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

看看第十个最新提交和第五个最新提交之间的区别。


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

类似于--仅名称,除非您得到一个简单的前缀,告诉您文件发生了什么(修改、删除、添加…)

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

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

  • 如果您对某些文件/文件夹发生的事情感兴趣,可以将-- [...]附加到git log版本。

  • 如果你想知道一次提交发生了什么,就称之为sha1,然后做埃多克斯1〔2〕

文件状态标志:m modified-文件已修改C copy edit-文件已被复制和修改r重命名编辑-文件已重命名和修改添加的文件已添加D已删除-文件已删除u unmerged-合并后文件有冲突


似乎没有人提到交换机--stat

1
2
3
4
5
6
7
8
9
10
11
$ 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

1
2
3
4
5
6
7
8
9
10
$ 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

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


但是,如果看到您的分支和它与另一个分支的共同祖先(比如origin/master)之间的文件发生了变化:

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


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

1
git diff --name-status mybranch..myotherbranch

注意优先顺序。如果先放置较新的分支,那么它将显示文件为已删除而不是已添加。

添加EDOCX1[3]可以进一步改进:

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

这将只显示添加到myotherbranch中的文件。


将下面的别名添加到您的~/.bash_profile,然后运行,source ~/.bash_profile;现在,只要您需要查看上次提交中的更新文件,就从Git存储库运行,showfiles

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


这将显示文件中的更改:

1
git diff --word-diff SHA1 SHA2

另外请注意,如果您只想查看最后一次提交和之前一次提交之间更改的文件。这行得通:git show --name-only


正如Artfulrobot在回答中所说:

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

我的例子:

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


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

它只记录一行(--pretty=oneline),这是更改文件的名称。还将把所有详细信息记录到输出文件中。


对于那些只需要关注Java文件的人来说,这就是我的解决方案:

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


以下内容对我很有用:

埃多克斯1〔13〕

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

埃多克斯1〔14〕

这对于在Jenkins中使用非常方便,在那里您可以获得一个变更集sha的列表,并希望对它们进行迭代,以查看哪些文件已被更改。

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


基于git diff --name-status,我编写了git diffview git扩展,它提供了两条路径之间发生变化的分层树视图。