git rev-list 默认按拓扑序排序,即父提交必在子提交之前,而非按时间顺序;需用 --date-order、--topo-order 或 --sort 参数显式指定时间或拓扑排序方式。

git rev-list 默认排序是拓扑序,不是时间序
直接运行 git rev-list HEAD 得到的提交顺序,是按拓扑依赖关系排列的(即父提交一定在子提交之前),**不是按提交时间(committer date)或作者时间(author date)排序的**。这点常被误认为“按时间倒序”,实际完全不保证。如果你需要严格的时间线回溯(比如查某天改了什么),必须显式加参数。
--date-order 和 --topo-order 的区别很关键
这两个参数控制的是“当多个分支并行提交时,如何交错输出”:
-
--topo-order:强制保持拓扑一致性——所有祖先必须出现在后代之前,哪怕它们时间更晚;适合做依赖分析、rebase 前检查图结构 -
--date-order:按提交时间(默认用 committer date)降序排,但**不破坏每个提交与其父提交的局部顺序**;适合看“最近做了什么”,结果更符合直觉 - 两者都需配合
--all或指定 ref 才能跨分支生效,单用HEAD仍只走一条路径
按 author date 或 committer date 精确排序要用 --sort
Git 2.19+ 支持 --sort 参数,比旧参数更灵活:
-
git rev-list --sort=author-date --all:按作者时间降序(适合追踪谁在什么时候写了什么) -
git rev-list --sort=committer-date --all:按提交者时间降序(适合 CI/自动化场景,因 cherry-pick、rebase 会改 committer date) -
--sort=-committer-date中的负号表示升序;可链式写多个如--sort=committer-date --sort=author-date(第二级排序) - 注意:
--sort会禁用拓扑约束,纯按时间字段排,可能把父提交排在子提交之后
rev-list 输出 commit hash 后,怎么快速看时间与信息
git rev-list 只输出哈希,想验证排序是否符合预期,别手写循环调 git show:
- 用
--pretty=format:直接内联格式化:git rev-list --sort=committer-date -n 5 --pretty=format:"%h %cr %s" HEAD - %cr 是相对时间(如 “2 hours ago”),%cd 是完整日期,%an 是作者名;避免用 %ct/%at(Unix 时间戳),不易读
- 如果发现时间看起来乱序,先检查是否用了
--topo-order—— 它优先保图结构,时间只是次要参考 - Windows 上 cmd 可能对双引号解析异常,建议用 Git Bash 或把 format 字符串用单引号包住











