在过去的两天里,Git显示了哪些文件被更改了。

82

如何创建一个包含最近两天内所有被修改文件的列表?我知道相关命令是:

git log --name-status --since="2 days ago" 

但是这将向我显示标识、日期和提交消息。我需要的只是被修改的文件名列表。

Git能做到这一点吗?

5个回答

116
git log --pretty=format: --name-only --since="2 days ago"

如果同一些文件在多个提交中重复出现,你可以使用管道符过滤它们。

git log --pretty=format: --name-only --since="2 days ago" | sort | uniq

你真的想要使用带有--stat修饰符的diff。这并不理想。 - Adam Dymitruk
7
根据AA发布的内容,git diff --stat @{2.days.ago}更短更简洁。 - Joshua Dance
@AdamDymitruk 但为什么? - Ejaz
git diff --stat @{2.days.ago} 不显示完整路径,对于长路径和多项目,路径可能重叠,导致输出无法使用。 - galmok

62
git diff --stat @{2.days.ago} # Deprecated!, see below

简短而有效

编辑

TLDR:使用 git diff $(git log -1 --before=@{2.days.ago} --format=%H) --stat

长说明:原始解决方案很好,但有一个小故障,它限制于reflog,换句话说,仅显示本地历史记录,因为reflog从未推送到远程。这就是为什么在最近克隆的存储库中会出现warning: Log for 'master' only goes back to...的原因。

我已经在我的机器上配置了这个别名

alias glasthour='git diff $(git log -1 --before=@{last.hour} --format=%H) --stat' 
alias glastblock='git diff $(git log -1 --before=@{4.hours.ago} --format=%H) --stat' 
alias glastday='git diff $(git log -1 --before=@{last.day} --format=%H) --stat' 
alias glastweek='git diff $(git log -1 --before=@{last.week} --format=%H) --shortstat | uniq' 
alias glastmonth='git diff $(git log -1 --before=@{last.month} --format=%H) --shortstat | uniq'                                                                                                                

致谢:以下答案来自@adam-dymitruk


1
这真的很棒。不确定为什么 pretty-format 获得了更多的投票。 - sevenfourk
1
@sevenfourk 对我来说,在慢服务器上开发大型项目时,这个解决方案比漂亮格式的要慢得多。此外,这样做会获得额外的信息,如果您正在使用任何脚本解析此输出,则可能会生成额外的工作。因此,我投票支持另一个方案。 - Nazareno Lorenzo
2
我不得不将其更改为 git diff --stat "@{2 days ago}",才能使其正常工作。(可能是因为我在Windows上) - Annabel
这在Cocoapods/Specs上不起作用,因为“警告:‘master’的日志仅追溯到[昨天]”。 - William Entriken
长路径被切短并加上 .../ 前缀,可能会破坏输出。 - galmok
有什么理由使用-1 --before而不是--after吗? - ConorSheehan1

3

使用 --raw 选项来查看 git log:

$ git log --raw --since=2.days

请参阅git log帮助页面中有关--diff-filter部分的说明,以了解在--raw格式中显示的标志的解释。它们解释了每个提交中文件发生的情况:
   --diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
       Select only files that are Added (A), Copied (C), Deleted (D),
       Modified (M), Renamed (R), have their type (i.e. regular file,
       symlink, submodule, ...) changed (T), are Unmerged (U), are Unknown
       (X), or have had their pairing Broken (B). Any combination of the
       filter characters (including none) can be used. When *
       (All-or-none) is added to the combination, all paths are selected
       if there is any file that matches other criteria in the comparison;
       if there is no file that matches other criteria, nothing is
       selected. 

感谢提供--diff-filter信息的详细资料。从现在开始了解它们真是太好了。 - dole doug

3

您可以使用以下命令对最接近两天前的版本进行差异比较:

git diff $(git log -1 --before="2 days ago" --format=%H).. --stat

--stat选项可提供更改摘要。添加--name-only选项可排除任何元信息并仅列出文件名。

希望这能有所帮助。


将两个Git命令合并在一起非常好,感谢您的指导。 - dole doug

3
git log --pretty="format:" --since="2 days ago" --name-only

我发现这个命令只会显示上一次提交的更改。 - Peng Qi

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