场景重现
假设基于 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 关系的真实结构