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

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

我应该使用什么命令?

【问题讨论】:

  • 对于提交及其父:stackoverflow.com/questions/424071/…
  • 您应该更改问题标题...您不想列出更改的文件名...您想列出更改的文件名。请注意,可以更改文件名而不更改其内容。

标签: git git-diff git-show


【解决方案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
              

              【讨论】:

                猜你喜欢
                • 2017-05-09
                • 2020-07-28
                • 2019-12-07
                • 2013-02-06
                • 2011-03-09
                • 2017-02-16
                • 2020-08-19
                • 2015-03-21
                相关资源
                最近更新 更多