最直接有效的方式是用 git for-each-ref 配合格式化输出,如 git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:iso8601) %(subject)' | head -20,可一次性按提交时间倒序列出前20个本地分支的名称、iso时间及提交标题,不依赖reflog,不受当前分支影响。

要快速掌握所有本地分支的活跃状态,最直接有效的方式是用 git for-each-ref 配合格式化输出,而不是逐个 git log -1 手动查——后者在分支多时效率极低,且容易漏掉 detached HEAD 下的提交。
git for-each-ref 查所有分支最新提交时间
这个命令能一次性列出全部本地分支及其最后一次提交的绝对时间、相对时间和提交摘要,不依赖 reflog 时效性,也不受当前所在分支影响。
-
git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:iso8601) %(subject)' | head -20:按提交时间倒序,显示前 20 个分支的名称、ISO 时间和提交标题 - 关键点:
%(committerdate:iso8601)比%cd更可靠,它取的是提交对象自带的时间戳,不受本地时区或git commit --date伪造影响 - 注意:
refs/heads/明确限定只查本地分支,不会混入 remote-tracking 分支(如origin/main),避免误判
git branch -v 显示简略但易读的最后提交信息
git branch -v 是最轻量的日常检查方式,适合快速扫一眼哪些分支“还活着”,但它只显示当前分支的 HEAD 提交摘要,其他分支只显示其 tip 的短哈希和第一行消息。
- 输出中每行开头的
*表示当前所在分支;其余分支的提交摘要可能被截断(尤其含 emoji 或长路径时) - 它不显示时间,仅靠哈希和消息判断“新旧”容易出错——比如两个分支都停在
abc1234,但实际提交时间差三天 - 若某分支长期没 push,
git branch -v仍会显示本地 tip,但远程可能早已落后,需配合git status -sb确认同步状态
git log -1 --pretty=... 针对单一分支查精确时间
当你要确认某个特定分支(比如 feature/login-v2)是否真有新进展,必须用 git log 加明确格式控制,否则默认输出包含冗余字段,难以脚本解析。
- 查绝对时间(推荐用于审计):
git log -1 --pretty=format:"%cd" --date=iso feature/login-v2→ 输出类似2026-05-04T14:22:31+08:00 - 查相对时间(适合人眼速判):
git log -1 --pretty=format:"%cr" feature/login-v2→ 输出类似2 days ago - ⚠️ 常见坑:
git log -1 feature/login-v2不加--pretty会输出完整 commit 对象内容,含 author/email/trees 等,干扰时间提取;且若分支不存在,会静默失败而非报错
reflog 不能替代真实提交时间
有人用 git reflog --date=iso | grep "checkout: moving from.*to feature" 推测分支活跃度,这是危险的——reflog 记录的是你本地的操作日志,不是代码变更事实。
- reflog 默认只保留 90 天(
gc.reflogExpire控制),超期条目自动清理,老分支的“创建”或“切换”记录会消失 - 一次
git checkout feature/x后什么都没改,reflog 里也会多一条记录,但这不代表该分支有新提交 - 真正反映分支进度的,永远只有该分支 tip commit 的
committerdate,其他都是旁证
分支是否“过期”,不能只看有没有 git push,也不能只信 reflog 里的 checkout 时间——唯一硬指标,是 git for-each-ref 输出的 committerdate 是否落在你设定的活跃窗口内。时间戳藏在 commit 对象里,骗不了人,也删不掉(除非重写历史)。











