Git log提交时间戳相同时的显示顺序疑惑及原因排查
Git Log 排序疑问解答
先看示例中带拓扑图的提交输出:
$ git log --oneline --graph * c3f035c (HEAD -> master) added files |\ | * df07f9e (alt) Add Z | * 85d52b4 Add Y | * cb54ba0 Add X * | 0ee077f Add E * | d968ccf Add D * | b0777d7 Add C |/ * a0be85a Add B * bb35288 Add A
这个输出通过--topo-order(--graph隐含该参数)严格按提交的拓扑依赖关系排序,能清晰展示分支合并的实际顺序。
但默认不带--graph的git log输出顺序看起来混乱:
$ git log --oneline c3f035c (HEAD -> master) added files df07f9e (alt) Add Z 85d52b4 Add Y cb54ba0 Add X 0ee077f Add E a0be85a Add B d968ccf Add D bb35288 Add A b0777d7 Add C
问题解答
提交C在最后、A和B被分开的原因
你的猜测完全正确:提交A到E的时间戳完全相同(Thu Mar 9 19:15:54 2023 +0200),这导致Git默认的逆时间序排序失去了判断依据,只能触发备用排序规则。时间戳相同时Git Log的排序规则
当多个提交的时间戳一致时,Git默认的git log(使用--date-order排序策略)会回退到按提交哈希值的逆字典序排列:- 把提交哈希当作字符串做字典序比较,哈希值更大的提交会被优先显示;
- 你看到的混乱顺序本质是这些提交哈希逆字典序的结果:比如提交C的哈希
b0777d7在A-E中字典序最小,逆序后就排在最后;提交A的哈希bb35288比D的d968ccf小,所以在D之后显示,最终导致A和B被其他提交隔开。
为什么
--graph输出顺序正常--graph参数隐含了--topo-order排序策略,该策略会忽略时间戳,严格按照提交的拓扑依赖(先显示所有子提交,再显示父提交)排列,因此能准确展示分支合并的实际提交顺序,不会出现默认排序的混乱情况。
内容的提问来源于stack exchange,提问作者sayshisnameisreal2222
相关产品推荐
相关产品推荐

