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

Posted

技术标签:

【中文标题】如何仅列出在两次提交之间更改的文件的名称【英文标题】:How to list only the names of files that changed between two commits 【发布时间】:2010-12-05 20:35:42 【问题描述】:

我在存储库中有一堆提交。我想查看两次提交之间更改的文件列表 - 从 SHA1SHA2

我应该使用什么命令?

【问题讨论】:

对于提交及其父:***.com/questions/424071/… 您应该更改问题标题...您不想列出更改的文件名...您想列出更改的文件名。请注意,可以更改文件名而不更改其内容。 【参考方案1】:
git diff --name-only SHA1 SHA2

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

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

查看第十次最新提交和第五次最新提交(左右)之间的差异。

【讨论】:

这也适用于 git show。 git show --name-only SHA1. git diff --name-status [TAG|SHA1] 也显示了对文件进行了哪些操作 您也可以执行以下操作: git diff --name-only HEAD@3 HEAD@0 以获得您想要比较的确切提交。 @AugustLilleaas 实际使用 show 只会显示 2 个特定提交,如果您在这 2 个提交之间有提交,它们将被忽略 如下所述,git diff --name-status 似乎不想显示添加的文件。 @sschuberth 指出 git show,这对我来说似乎工作正常:git show --pretty=format: --name-status。只是做git show --name-status 提供了更多信息,但仍然很好而且密集......这将是我的新 goto 命令;)【参考方案2】:
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]

文件状态标志:

Flag Name Meaning
M modified File has been modified
C copy-edit File has been copied and modified
R rename-edit File has been renamed and modified
A added File has been added
D deleted File has been deleted
U unmerged File has conflicts after a merge

【讨论】:

我碰巧说 git diff --name-status 它确实给出了“添加的文件”。 对于 git log,它需要在 SHA 之间有两个点,例如 SHA1..SHA2,并且第二个 SHA 不是可选的,所以它应该是这样的: git log --name-状态 --oneline [SHA1..SHA2] --relative[=<path>] 选项可能对您有所帮助,我不确定。否则总是有| erep -v '(.tmp|.foo|.dontwant)$' ... @artfulrobot 你的意思是egrep @DavidMoles 是的,但我现在无法编辑评论!【参考方案3】:

但要查看您的分支与其共同祖先与另一个分支(例如 origin/master)之间的文件更改:

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

【讨论】:

这真的很有用!我希望我可以简单地说 git diffstatus master 或类似的,这会触发上述情况。 git show --pretty=format: --name-only origin/master.. 您可能无法将其设为 git 别名,但您绝对可以将其放入 .bashrc 中。 或者更简单:git diff --name-only HEAD...master(注意三个点)。详细解释见here。 看起来大部分是正确的答案!简单的git diff --name-only master..branch 不对应 github PR 列表。这种方式更精确。但无论如何,我有 173 个 chaned 文件,而 github PR 中有 171 个。 (没有 merge-base 我有 228 对 171)【参考方案4】:

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

git diff --name-status mybranch..myotherbranch

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

添加grep 可以进一步完善:

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

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

【讨论】:

正则表达式很好,几乎可以做任何事情。不过,在这种情况下,还有 --diff-filter 本身提供了此功能,这意味着错误结果的可能性较小(例如误报) 如果文件名中有"A\t",这将不起作用。你需要grep "^A\t"【参考方案5】:

使用

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

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

【讨论】:

git log --pretty=oneline 只给我 SHA 和使用 git 2.10.1 的提交消息 在 Windows 上?在什么情况下?【参考方案6】:

这将显示文件中的更改:

git diff --word-diff SHA1 SHA2

【讨论】:

【参考方案7】:

将以下别名添加到您的~/.bash_profile 文件中,然后运行source ~/.bash_profile;现在任何时候你需要在你的 git 存储库中查看上次提交、运行 showfiles 中的更新文件。

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

【讨论】:

git config --global alias.showfiles 'show --pretty="format:" --name-only' 变成git showfiles【参考方案8】:

另外请注意,如果您只想查看上次提交和之前的提交之间更改的文件,这可以正常工作:

git show --name-only

【讨论】:

简单易记。它应该得到更多的支持。【参考方案9】:

基于git diff --name-status,我编写了git-diffview Git 扩展,它呈现了两个路径之间变化的分层树视图。

【讨论】:

【参考方案10】:

好像没有人提到开关--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(-)

【讨论】:

接受的答案是正确的,但这非常有用,并为您提供了一些额外的信息。谢谢! 同意这是一个更有用的答案,因为它包含差异统计信息。【参考方案11】:

正如 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

【讨论】:

【参考方案12】:

以下内容对我很有效:

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

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

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

这对于在Jenkins 中使用非常方便,您可以在其中获得变更集 SHA 哈希值的列表,并希望对其进行迭代以查看哪些文件已被更改。

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

【讨论】:

【参考方案13】:

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

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

【讨论】:

【参考方案14】:

如果有人正在查找已更改文件的列表,包括暂存文件

git diff HEAD --name-only --relative --diff-filter=AMCR

git diff HEAD --name-only --relative --diff-filter=AMCR sha-1 sha-2

如果需要绝对路径,请删除 --relative

【讨论】:

【参考方案15】:

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

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

git --no-pager  diff --name-only sha1 sha2

【讨论】:

以上是关于如何仅列出在两次提交之间更改的文件的名称的主要内容,如果未能解决你的问题,请参考以下文章

sh 列出两次提交之间更改的文件

sh 列出两次提交之间更改的文件

我可以通过 GH API 在两次提交之间获取一个文件的差异数据吗?

sh 在两次提交之间导出diff文件

如何计算 Git 中两次提交之间更改的行数?

git:显示两次提交之间所有更改的文件