要用 git log 提取某月所有提交记录,需用 --since 和 --until 动态指定时间范围,例如 --since="2024-06-01" --until="2024-07-01"(右边界设为下月首日),避免漏掉月末提交;linux/macos 可用 date 命令动态生成,windows powershell 需用 get-date 配合 .addmonths(1) 精确计算月初。

怎么用 Git log 提取某月所有提交记录
Git 本身不存“月份”元数据,得靠 --since 和 --until 配合时间范围筛选。关键不是写死“2024-06”,而是动态生成当月首尾时间——否则脚本一跑就过期。
常见错误是直接写 git log --since="2024-06-01" --until="2024-06-30":漏掉 6 月 30 日 23:59 的提交(--until 默认截断到当天 00:00);更稳妥的是用 --until="2024-07-01",把“下月第一天”当右边界。
- Linux/macOS 可用
date -d "last month" +%Y-%m-01和date -d "this month" +%Y-%m-01动态算区间 - Windows PowerShell 用户注意:
Get-Date -Day 1得配合.AddMonths(1)才能准确得月初 - 时间格式必须为
YYYY-MM-DD,YYYY/MM/DD或带时分秒的格式在部分 Git 版本里会静默失败
如何按分支 + 开发者聚合提交次数
git log 默认只输出当前分支历史,要统计多分支,得显式指定 branch1 branch2 ... 或用 refs/heads/* 匹配全部本地分支——但要注意:它不包含远程分支(如 origin/main),除非你加 --remotes 参数。
聚合逻辑不能靠肉眼数行,得用管道链:git log 输出每条提交的作者邮箱(--format="%ae")和所在分支(需先 checkout 或用 git show-branch 辅助),但更稳的方式是遍历分支、逐个执行 git log --oneline --author="..."。
- 作者识别优先用
%ae(邮箱),不用%an(姓名)——同名不同人、大小写不一致都会导致重复计数 - 分支名含斜杠(如
feature/login)时,shell 里要用引号包裹,否则通配符可能被提前展开 - 避免用
git log --all统计:它包含所有引用(tag、stash),噪音大且无法区分分支归属
为什么统计结果里同一人出现多次
最常踩的坑是开发者用了多个邮箱:公司邮箱、GitHub 邮箱、Gmail 临时注册邮箱……Git 把它们当不同作者。脚本里不做归一化,统计就失真。
解决方法不是改历史(不可能),而是在聚合前做映射。比如建个 author-map.txt:
john@company.com → john@example.com<br>john.doe@gmail.com → john@example.com
实际处理时用 awk 或 sed 替换再统计,而不是依赖 Git 内置功能。
- 映射表必须覆盖所有高频提交邮箱,漏一个就少一人次
- 别用正则盲目合并(如把所有
@gmail.com合并),容易误伤真实不同人 - 如果团队用 Git 钩子统一规范邮箱,这步可省;但多数团队没这机制,得手动维护映射
Shell 脚本跑着跑着卡住或报错 “fatal: ambiguous argument”
这通常是因为分支名含空格或特殊字符(如 bugfix/ios v2),shell 展开后变成两个参数。Git 报错说找不到 bugfix/ios 和 v2 这两个分支。
还有种情况是分支名以 - 开头(如 -temp),Git 误认为是命令选项。
- 遍历分支时用
git for-each-ref --format="%(refname:short)" refs/heads/,比git branch --format更可靠,且输出天然带引号保护 - 每次调用
git log前,把分支变量用双引号包住:"$branch",不是$branch - 加
2>/dev/null忽略无效分支警告,但别吞掉真正错误(如仓库损坏)
真正的麻烦不在语法,而在分支生命周期——已删除的远程分支还在本地 reflog 里,refs/heads/* 仍会列出它,但 git log $branch 会失败。得先用 git show-ref --verify -q refs/heads/$branch 检查分支是否存在。











