如何获取两个Git提交之间所有更改的文件列表?

249

由于官僚主义的原因,我需要获取仓库中所有已更改文件的列表以备报告使用(我从现有的源代码开始)。

我应该运行什么命令才能获取此列表?


69
由于官僚主义。 - ptim
10个回答

335

对于在给定 SHA 和当前提交之间更改的文件:

git diff --name-only <starting SHA> HEAD

或者,如果您想要包含已更改但尚未提交的文件:

git diff --name-only <starting SHA>

更普遍地,以下语法总是会告诉你在两个提交之间(由它们的 SHA 或其他名称指定)哪些文件发生了变化:

git diff --name-only <commit1> <commit2>

使用 --name-status 而不是 --name-only 将会展示文件的变化情况和名称。


5
如果您想知道特定提交所修改的文件,请执行以下操作:git diff --name-only <SHA> <SHA>^ - thebugfinder

78

要找到自上次提交以来修改过的所有文件的名称:

git diff --name-only
或者(如果需要更多信息,包括未跟踪的文件):
git status

使用git status --uno命令可以加快未跟踪文件的枚举过程。 - SouthSun

63
  • 列出所有未暂存的已跟踪修改文件:

git diff --name-only
列出所有已经暂存的被跟踪的修改过的文件:
git diff --name-only --staged
  • 列出所有已暂存和未暂存的已跟踪变更文件:

  • { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
    列出所有未跟踪的文件(即由git status列出的文件,不包括任何已被忽略的文件):
    git ls-files --other --exclude-standard
    

    如果您正在使用这些命令来编写shell脚本,并且想要通过程序化方式检查这些命令是否返回了任何内容,那么您将会对git diff--exit-code选项感兴趣。


    20

    当我添加/修改/删除了许多文件(自上次提交以来),我喜欢按时间顺序查看这些修改。

    为此,我使用:

    • 列出所有未暂存的文件:

      git ls-files --other --modified --exclude-standard
      
    • 获取每个文件的最后修改日期:

    • while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
      

    尽管ruvim评论中建议:

    xargs -0 stat -c '%y %n' -- 
    
    • 将它们从最早到最近排序:

    sort
    

    使用别名可以更方便地使用:

    alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'
    

    或者(更短更高效,感谢ruvim

    alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'
    
    例如:
    username@hostname:~> gstlast
    2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
    2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
    2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
    2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
    2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
    2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd
    

    我现在可以按照时间顺序查看我的修改,从最旧的到最近的。


    10

    我需要列出在两个提交之间更改了内容的文件列表(仅包括添加的A或修改的M),因此我使用了:

    git diff --name-only --diff-filter=AM <from_commit_hash> <to_commit_hash>
    

    这里是git diff文档中不同的--diff-filter选项(也可以参考man git diff):

    --diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

    选择仅包含以下类型的文件: 添加的 (A), 复制的 (C), 删除的 (D), 修改的 (M), 重命名的 (R), 类型改变的 (例如常规文件、符号链接和子模块等) (T), 未合并的 (U), 未知的 (X) 或配对已断开的 (B)。可以使用任何过滤器字符的组合(包括不使用任何字符)。当在组合中添加“*”(全选或不选)时,如果比较中存在任何匹配其他条件的文件,则选择所有路径;如果没有与其他条件匹配的文件,则什么都不选。

    此外,这些大写字母可以小写以排除。例如,--diff-filter=ad 排除添加和删除的路径。

    请注意,并非所有的差异都可以展现出所有类型。例如,从索引到工作树的差异永远不能有添加条目(因为差异中所包括的路径集受索引中内容的限制)。类似地,如果禁用了复制和重命名类型的检测,则不能出现复制和重命名条目。

    如果您想同时列出状态(例如 A / M),请将 --name-only 更改为 --name-status
    git diff --name-status --diff-filter=AM <from_commit_hash> <to_commit_hash>
    


    3
    可以使用 git status 命令和类似下面的 grep 命令获取未暂存的修改列表。例如:git status -s | grep M
    root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
     M src/.../file1.js
     M src/.../file2.js
     M src/.../file3.js
     ....
    

    请注意,此功能仅适用于未暂存的更改,因此对于“在两个Git提交之间更改的文件”没有用处。 - John Vandenberg
    git status --porcelain - undefined

    3

    使用 git show 命令可以得到类似的结果。若要查看提交记录(就像在 git log 视图中一样),以及包含其中的文件列表,可以使用以下命令:

    git show --name-only [commit-id_A]^..[commit-id_B]
    

    当你想要展示的最后一次提交为[commit-id_B],而初始提交为[commit-id_A]时,请注意使用^符号。如果不使用该符号,则无法展示[commit-id_A]信息。


    1

    获取修改过的文件列表并将其保存到文本文件中最简单的方法是:

    git diff --name-only HEAD^ > modified_files.txt
    

    0

    如果您想要检查更改的文件,需要注意许多小细节,例如最好使用哪种方法,

    例如,如果您想要检查哪些文件已更改,请键入

    git status -- 它将显示具有更改的文件

    然后,如果您想要知道要进行的更改,可以通过以下方式进行检查,

    git diff -- 将显示所有文件中的所有更改

    仅当只修改一个文件时才是最佳选择

    如果您想要检查特定文件,则使用

    git diff


    0

    一些在GitHub Actions中针对类型(pull_request或合并到主分支)适用于我的筛选器有:

    git --no-pager diff --name-only --diff-filter=ACMRT ${{github.event.pull_request.base.sha}} ${{ github.event.pull_request.head.sha }}
    

    git --no-pager diff --name-only --diff-filter=ACMRT ${{github.event.pull_request.base.sha}} ${{github.sha}}
    

    git log -m -1 --name-only --pretty="format:" ${{ github.sha }}
    

    尝试这些,看看哪一个适合您的需求。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接