git导出指定时间提交本质是用git log筛选哈希,再配合format-patch或archive生成内容;核心参数--since/--until仅认iso(如"2026-04-20")和自然语言格式,错误格式会被静默忽略。

Git 本身不提供“导出”功能,所谓“导出指定时间的提交”,本质是用 git log 筛出提交哈希,再配合 git format-patch 或 git archive 生成可分发内容——漏掉这层理解,直接抄命令容易导出错东西。
用 --since 和 --until 精确圈定日期范围
这两个参数是筛选的核心,但 Git 只认两种格式:ISO 标准("2026-04-20")和自然语言("3 days ago")。写成 "2026/04/20" 或 "20-04-2026" 会被静默忽略,命令看似执行成功,实则返回全部日志。
-
git log --since="2026-04-20" --until="2026-04-24":查 4 月 20 日至 24 日(含)的提交 -
git log --since="2026-04-22 09:00" --until="2026-04-22 17:30":支持精确到分钟,适合事故回溯 - Windows PowerShell 用户注意:
git log --since="yesterday 00:00"中的空格和冒号在 PowerShell 里可能被误解析,建议用单引号包裹整个值
作者、路径、关键词要组合着加,别只靠时间
单靠时间范围容易捞出大量无关提交。比如 CI 自动合并的提交、文档更新、依赖升级等,它们的 committer date 往往集中在同一时段。
- 加
--author="zhangsan"锁定人,避免拉进别人批量提交的噪音 - 加路径限制,如
-- src/api/,Git 会跳过未改动该目录的提交,大幅提速 - 加
--grep="fix|bug"过滤提交信息,-i可忽略大小写 - 注意:
--author匹配的是 author 字段,不是 committer;如果某人 rebase 后提交,作者名可能和实际操作人不一致
导出补丁前,先确认用的是 author date 还是 committer date
默认 git log 显示和过滤用的都是 committer date(即执行 git commit 或 git merge 的时间),但如果你要按“代码真正写出来的时间”筛选(比如排查某次手写代码引入的问题),就得切到 author date。
- 用
git log --pretty=format:"%h %ad %cd %s" --date=short对比两列日期,看是否一致 - 若不一致,且需按 author date 筛,必须显式加
--author-date-order,否则--since仍按 committer date 生效 - 导出补丁时:
git format-patch --stdout --since="2026-04-20" --author-date-order origin/main才能确保时间逻辑对得上
大仓库里不加 -n 就跑时间筛选,等于主动卡死自己
在几万提交的仓库里执行 git log --since="1 month ago",Git 默认从 HEAD 开始遍历整个 DAG 图,不设上限就扫到底——尤其加上 --all 或没指定分支时,耗时可能从秒级升到分钟级。
- 加
-n 50限制条数:git log -n 50 --since="3 days ago" --oneline,响应立刻变快 - 明确指定分支:
git log main --since="2026-04-20"比--all快一个数量级 - 如果只是要打包某段时间的代码快照,用
git archive --format=zip --output=release-20260422.zip HEAD $(git log --since="2026-04-20" --pretty="%h" -n 1)更轻量,不用生成 patch 文件
最容易被忽略的是时区和 date 字段的隐式绑定:本地 Git 配置的时区决定 "yesterday" 的起始点,而 --since 默认只作用于 committer date —— 如果你没验证过仓库里 author date 和 committer date 的分布差异,按时间导出的结果很可能漏掉关键提交。











