Git工作树中,基于已用--update-refs变基的分支再变基的原理疑问
Git变基中提交匹配的原理
先还原你的场景:
初始分支结构:
master: A - B - C - D \ branch1: E - F \ branch2: G - H
将branch1变基到master(使用--update-refs)后:
master: A - B - C - D \ \ branch1: \ E' - F' \ branch2: E - F - G - H
将branch2变基到branch1后得到:
master: A - B - C - D \ branch1: E' - F' \ branch2: G' - H'
为什么Git能识别E'、F'和E、F是同一提交?
Git判断提交是否为"同一变更",核心靠patch-id:
- patch-id是提交对应diff内容的哈希值,只要两个提交的变更内容(文件修改)、作者信息、提交说明完全一致,它们的patch-id就相同。
- E'是E基于master的D重新生成的提交,虽然提交哈希(commit hash)不同,但变更内容和E完全一致,所以patch-id和E一致;F'同理。
为什么变基branch2到branch1不会重复带上E、F?
变基的本质是重播提交:
- Git会先找出branch2和目标基分支(branch1)的"最近共同祖先",对比后发现branch2上的E、F对应的patch-id已经存在于branch1的E'、F'中。
- 变基过程中,Git会自动跳过这些已经在目标分支中存在的"等价提交",只重播那些没有被匹配到的提交(也就是G、H),基于F'重新生成G'、H'。
这就是为什么最终branch2不会出现E、F重复的情况。
内容的提问来源于stack exchange,提问作者TheFibonacciEffect
相关产品推荐
相关产品推荐

