使用--after/--before参数时git log无法列出已存在提交的问题
Git log 日期筛选失效问题原因及解决方案
核心原因
- 时区解析偏差:
git log的--after/--before参数默认将输入的时间视为当前系统的本地时区进行解析,而lore.kernel邮件归档仓库的提交日期(无论是作者日期还是提交者日期)通常带有时区标识(多为UTC或邮件发件人所在时区),如果两个时区存在差异,会出现计算偏差,导致字面日期匹配的提交被过滤。比如提交日期是UTC时区的2021-08-23 00:00,如果你本地是西五区,输入的--after='2021-08-22 23:59:59'会被解析为西五区时间,对应UTC时间为2021-08-23 04:59:59,早于该时间的提交就会被排除,极端时区差下甚至会出现指定--after=2000-01-01也过滤掉目标提交的情况。 - 日期筛选字段不匹配:Git提交包含两个独立的日期字段:
- 作者日期(对应
pretty格式的%ad占位符):记录邮件实际发送的时间 - 提交者日期(对应
pretty格式的%cd占位符):记录邮件被归档到lore仓库的时间
默认情况下git log的时间筛选规则只对提交者日期生效,如果你要筛选的是邮件发送的作者日期,默认参数不会匹配该字段。你观察到的“指定--after为2021年8月1日时只能看到8月25、26、27日的提交”,本质就是8月23日的邮件实际归档入库的时间在8月25日之后,默认用提交者日期筛选自然看不到对应的记录。
- 作者日期(对应
修复方案
- 给时间参数明确指定UTC时区,避免时区偏差:
git log --pretty='%H - %cd' --after='2021-08-22 23:59:59 UTC' --before='2021-08-24 00:00:00 UTC'
- 如果要基于邮件发送时间(作者日期)筛选,添加
--author-date参数让时间筛选规则作用于作者日期:
git log --pretty='%H - %ad' --author-date --after='2021-08-22 23:59:59 UTC' --before='2021-08-24 00:00:00 UTC'
- 调整筛选规则前可以先执行以下命令,确认目标提交的两个日期字段和对应时区:
git log -10 --pretty='作者日期: %ad | 提交者日期: %cd'
内容的提问来源于stack exchange,提问作者Matt Keenan
相关产品推荐
相关产品推荐

