两名用户同一秒执行git commit后推送,git log如何判断提交先后顺序?
Git如何判定同一秒生成的两个提交的先后顺序
当两名用户基于公共仓库的同一个父提交,各自在本地完成修改后同一秒执行git commit,再向同一个仓库推送时,git log的排序逻辑如下:
- 首先参考提交内置的两个时间戳:作者时间戳(用户执行commit操作的本地设备时间)和提交者时间戳(提交被应用到当前分支的时间,执行cherry-pick、变基等操作时会更新该时间),git默认按提交者时间戳的倒序排列提交,时间越新的提交越靠前。
- 由于git的时间戳分辨率为1秒,若两个提交用于排序的参考时间戳完全一致,git会使用提交的唯一哈希值作为补充判断依据,按哈希值的字典序完成最终排序。
- 即使两名用户主观上同时触发commit操作,也可能因为各自本地设备的系统时间存在偏差,导致两个提交的时间戳并不相同,此时会直接按时间戳排序,不会触发哈希比较逻辑。
- 补充常规推送场景的限制:如果两名用户都向同一个分支推送,第一个用户推送成功后,第二个用户的推送默认会被仓库拒绝,需要先拉取最新代码完成合并/变基、生成新的合并提交后才能推送成功,这种情况下合并后的提交时间戳会晚于两个并行提交,不存在顺序判定的问题。
- 如果执行
git log时指定了--topo-order参数,git会优先按提交的拓扑关系排序,避免并行的兄弟提交穿插排列,此时同一父节点的两个兄弟提交的顺序依然会先参考时间戳、再参考哈希值。
内容的提问来源于stack exchange,提问作者Vahid Pazirandeh
相关产品推荐
相关产品推荐

