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

Sha*_*awn 1807 git git-diff git-show

我在回购中有一堆提交.我想看到两个提交之间更改的文件列表 - 从SHA1到SHA2.

我应该使用什么命令?

Pet*_*ter 2466

git diff --name-only SHA1 SHA2
Run Code Online (Sandbox Code Playgroud)

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

git diff --name-only HEAD~10 HEAD~5
Run Code Online (Sandbox Code Playgroud)

查看第十个最新提交和第五个最新提交(或左右)之间的差异.

  • 这也适用于git show.`git show --name-only SHA1`. (140认同)
  • `git diff --name-status [TAG | SHA1]`显示对文件执行了哪些操作 (70认同)
  • @AugustLilleaas实际上使用show只会显示2个特定的提交,如果你在这两个提交之间提交它们将被遗漏 (7认同)
  • 如下所述,`git diff --name-status`似乎不想显示添加的文件.@sschuberth指出`git show`,它看起来对我来说似乎正常:`git show --pretty = format:--name-status`.只是做`git show --name-status`提供了更多的信息,但仍然很好和密集...这将是我的新goto命令;) (3认同)
  • 你也可以这样做:git diff --name-only HEAD @ {3} HEAD @ {0},用于你想要比较的确切提交. (2认同)

art*_*bot 393

git diff --name-status [SHA1 [SHA2]]
Run Code Online (Sandbox Code Playgroud)

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

git log --name-status --oneline [SHA1..SHA2]
Run Code Online (Sandbox Code Playgroud)

类似,但提交消息后列出了提交,因此您可以看到文件何时更改.

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

  • 如果你想看看单个提交发生了什么,称之为SHA1,然后做
    git log --name-status --oneline [SHA1^..SHA1]

文件状态标志:
M已修改 - 文件已被修改
C copy-edit - 文件已被复制和修改
R rename-edit - 文件已被重命名和修改
A已添加 - 文件已添加
D已删除 - 文件已被删除
U unmerged -合并后文件有冲突

  • 我不确定`--relative [= &lt;path&gt;]`选项可能对您有帮助。否则总会有`| erep -v'(.tmp | .foo | .dontwant)$'`... (2认同)

lee*_*wah 68

似乎没有人提到过这个开关--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(-)
Run Code Online (Sandbox Code Playgroud)

还有 --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
Run Code Online (Sandbox Code Playgroud)

--shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案是正确的,但这是非常有用的,并为您提供一些额外的信息.谢谢! (4认同)
  • 同意这是一个更有用的答案,因为它包含diff统计信息。 (2认同)

Tim*_*mes 49

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

git diff --name-only `git merge-base origin/master HEAD`
Run Code Online (Sandbox Code Playgroud)

  • 或者`git show --pretty = format: - name-only origin/master..`. (3认同)
  • 甚至更简单:`git diff --name-only HEAD ... master`(注意三个点)。有关详细说明,请参见[here](http://stackoverflow.com/a/7256391/2063031)。 (2认同)
  • 看起来大部分都是正确的答案!简单的 `git diff --name-only master..branch` 与 github PR 列表不对应。这样就更精确了。但无论如何,我有 173 个已修改的文件,而 github PR 中有 171 个。(没有 `merge-base` 我有 228 vs 171) (2认同)

m12*_*rpv 39

之前每个答案的最大问题是,如果您想使用试图从存储库中获取的信息,您会被输入寻呼机,这是非常烦人的。特别是如果您是一名开发人员,宁愿学习您要开发的应用程序的业务逻辑,而不是学习 vim 命令。

使用 --no-pager 可以解决这个问题。

git --no-pager diff --name-only sha1 sha2
Run Code Online (Sandbox Code Playgroud)

  • `--no-pager` 确实很关键。感谢您脱颖而出。 (2认同)

Max*_*eod 20

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

git diff --name-status mybranch..myotherbranch
Run Code Online (Sandbox Code Playgroud)

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

添加a grep可以进一步细化:

git diff --name-status mybranch..myotherbranch | grep "A\t"
Run Code Online (Sandbox Code Playgroud)

然后,这将只显示添加的文件myotherbranch.

  • Regexes很好,几乎可以做任何事情.但是,在这种情况下,还有`--diff-filter`本机提供此功能,这意味着错误结果的可能性更小(例如误报) (4认同)

bli*_*ile 9

以下对我来说效果很好:

git show --name-only --format=tformat: SHA1..SHA2
Run Code Online (Sandbox Code Playgroud)

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

git show --name-only --format=tformat: SHA1
Run Code Online (Sandbox Code Playgroud)

这在Jenkins中使用很方便,您可以在其中获得变更集 SHA 哈希值的列表,并且想要迭代它们以查看哪些文件已更改。

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


Zor*_*ayr 8

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

alias showfiles='git show --pretty="format:" --name-only'
Run Code Online (Sandbox Code Playgroud)

  • 或`git config --global alias.showfiles'show --pretty =“ format:” --name-only'`来制作`git showfiles`。 (2认同)

Jul*_*ins 7

这将显示文件中的更改:

git diff --word-diff SHA1 SHA2
Run Code Online (Sandbox Code Playgroud)


Par*_*ris 5

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


K. *_*bol 5

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

 git diff --name-status SHA1 SHA2 | grep '\.java$'
Run Code Online (Sandbox Code Playgroud)