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


178

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

我应该运行什么才能获得此列表?


34
“由于官僚主义” xD
ptim

Answers:


238

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

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

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

git diff --name-only <starting SHA>

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

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

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

3
使用--name-status标记代替--name-only可以方便地获取文件列表并查看其修改状态,例如“已添加”或“已修改”。
Thane Plummer

@Amber应该提到@Thane普卢默指出,--name-status显示他们发生了什么
佐尔坦SULE

64

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

git diff --name-only

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

git status

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

    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选项。


16

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

为此,我使用:

  • 列出所有非暂存文件:

    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

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


为什么不使用xargs和单次调用stat?完整的git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
单线

@ruvim谢谢。很好的建议。我已经编辑了答案以包含您的评论,以提高可见度。
VonC

4

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

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

git diff文档中不同的diff-filter选项:

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


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,

2

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

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

[commit-id_A]初始提交在哪里[commit-id_B],最后提交在哪里是您想要显示的位置。

特别注意^符号。如果您不这样做,则将不会部署commit-id_A信息。


1

如果要检查已更改的文件,则需要处理许多小事情,例如最好使用哪种,例如,如果要检查已更改的文件,只需键入

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

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

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

仅当修改了一个文件时,它才是好的

如果要检查特定文件,请使用

git差异

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.