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

时间:2011-02-23 19:50:32

标签: git

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

我应该怎样运行以获取此列表?

9 个答案:

答案 0 :(得分:198)

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

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

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

git diff --name-only <starting SHA>

更一般地说,以下语法将始终告诉您哪些文件在两次提交之间发生了更改(由其SHA或其他名称指定):

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

答案 1 :(得分:56)

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

git diff --name-only

或者(有关更多信息,包括未跟踪文件):

git status

答案 2 :(得分:45)

  • 列出所有非暂存跟踪的已更改文件:

    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的{​​{1}}选项感兴趣。

答案 3 :(得分:13)

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

为此,我使用:

  • 列出所有非暂存文件:

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

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    
  • 要将它们从最旧到最近排序:

    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'

例如:

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

我现在可以查看我的修改,从最旧到最近。

答案 4 :(得分:3)

可以使用git statusgrep命令获取未分段修改的列表,如下所示。像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
 ....

答案 5 :(得分:3)

我需要一个在两次提交之间更改内容的文件列表(仅添加或修改),所以我使用了:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

git diff documentation

中的不同差异滤镜选项
  

<强> DIFF-滤波器= [(A | C | d | M | R | T | U | X | B)... [*]]

     

仅选择已添加(A),复制(C),删除(D),修改(M),重命名(R)的文件,更改其类型(即常规文件,符号链接,子模块...) T),Unmerged(U),Unknown(X),或已配对破碎(B)。可以使用过滤器字符的任何组合(包括无)。当*(全部或全部)添加到组合中时,如果有任何文件与比较中的其他条件匹配,则选择所有路径;如果没有符合其他条件的文件,则不会选择任何内容。

     

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

如果您还要列出状态(例如A / M),请将--name-only更改为--name-status

答案 6 :(得分:1)

使用git show,您可以获得类似的结果。为了查看提交(就像它在git log视图中查看)并包含其中的文件列表,请使用:

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

其中[commit-id_A]是初始提交,[commit-id_B]是最后一次提交而不是您想要显示。

使用^符号

特别关注。如果不这样做,则不会部署commit-id_A信息。

答案 7 :(得分:1)

如果您想检查更改的文件,您需要处理许多最好使用的小东西, 就像你想要检查改变了哪个文件只需输入

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

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

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

仅在仅修改一个文件时才有用

如果您想查看特定文件,请使用

git diff

答案 8 :(得分:0)

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

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