git shortlog -sn 仅统计提交次数,不能反映代码增删行数;需用 git log --author=... --numstat 配合 awk 才能准确按人汇总新增/删除行数,注意邮箱别名、合并提交及 author/committer 不一致导致的偏差。

Git 本身不直接提供“贡献行数”统计,git shortlog 只能按提交次数和作者名归总——想看代码增删量,必须组合其他命令。
用 git shortlog -sn 快速看谁提交最多
这是最常用起点,列出所有作者及其提交次数(按字母序):
git shortlog -sn
常见错误是漏掉 -n(按次数降序),导致结果难读;也有人误加 -e 想看邮箱却没配合 -n,结果仍是字母序。实际应优先用:
-
git shortlog -sn --all --no-merges:排除合并提交,更反映真实开发量 - 加
--since="3 months ago"限定时间范围,避免历史僵尸账号干扰 - 注意:同一人不同邮箱(如
name@work.com和name@gmail.com)会被算作两人——需先用git config --global user.email统一,或后期手动合并
想看增删行数?得靠 git log --author=... --oneline + git diff
git shortlog 不处理代码变更量,必须拆解到每次提交再汇总。典型做法是:
git log --author="John" --pretty=tformat: --numstat | awk '{add+=$1; subs+=$2; loc+=$1-$2} END {printf "added: %s, removed: %s, loc: %s\n", add, subs, loc}'
关键点:
-
--numstat输出格式固定为新增行数 删除行数 文件路径,awk才能可靠解析 - 别用
--shortstat:它只给总量摘要,无法按作者拆分 - Windows 用户若无
awk,可用 PowerShell 替代,但要注意git log的换行符和字段分隔问题——建议 WSL 或 Git Bash 下执行更稳
多人批量统计:写个 shell 脚本比 GUI 工具更可控
第三方工具(如 git-stats)常默认统计全部分支、含 merge,数据失真。自己写几行脚本反而干净:
#!/bin/bash
git shortlog -sne | while read count email; do
name=$(echo "$email" | sed 's/[^]*\)>/\1/')
lines=$(git log --author="$email" --pretty=tformat: --numstat 2>/dev/null | awk '{add+=$1; subs+=$2} END {print add-subs}')
echo "$name,$count,${lines:-0}"
done | sort -t, -k3 -n -r
这里踩坑最多的是:git log --author 匹配的是完整邮箱字符串,不是昵称;如果 shortlog -se 输出带空格的昵称(如 "John Doe <j>"</j>),直接传给 --author 会失败——所以脚本里先抽邮箱再查,才准确。
真正麻烦的从来不是命令怎么敲,而是作者身份不一致、提交未关联邮箱、rebase 后 author/committer 混用——这些都会让统计值突然跳变。上线前务必用 git log --pretty="%an %ae %cn %ce" -n 5 抽样核对四列是否合理。











