天天看点

Git Merge 三路合并

场景重现

假设基于 master 的 0003 节点产生一个新分支 dev, dev 分支增加 0004,0005 commit,master 增加 00004.5,0005.5 commit 节点,基于 dev 做 merge 操作。

master: 0001 -> 0002 -> 0003 -> 0004.5 -> 0005.5

dev:    0001 -> 0002 -> 0003 -> 0004 -> 0005      
如在 dev 没有 00004,0005 的情况下,拉取 merge 操作视为线性操作,可有效结合历史 commit,采用了 Fast-Forward 的策略,不会产生新的 merge 节点。

合并结果

在不可结合历史 commit 的情况下,Git Merge 产生一个 merge 节点,该节点拥有两个父节点,合并后为非线性的状态。Git 将会将之前的 commit 进行重组,所呈现的 log 为线性,实际上是树状结构。以上面的 dev 和 master 为例,存在 commit 节点时间顺序都在穿插的情况,以时间为顺序重组非线性的历史记录。

Git Log 状态

# after merge 
dev: 0001 -> 0002 -> 0003 -> 0004 -> 0004.5 -> 0005 -> 0005.5 -> merge node      
查看 git log 的结构为线性,1/3 为 merge 前 master 的 commits,2/4 为 merge 前 dev 的 commits

Tree 状态

# after merge
dev: 0001 -> 0002 -> 0003 -> 0004   -> 0005   -> merge node
                           -> 0004.5 -> 0005.5      
commit 关系的真实结构