做网站成本,企业专业网站设计公,广州什么地方好玩,网站建设分录怎么开分支 1: C0 → C1 → C2 → C3#xff08;最新#xff09;
分支 2: C0 → C4 → C5 → C6#xff08;最新#xff09;1. 找到共同父节点 C0
Git 会先找出 branch1 和 branch2 的共同祖先节点 C0。这通常借助 git merge-base 命令达成#xff0c;虽然在日常使用 git merge…分支 1: C0 → C1 → C2 → C3最新
分支 2: C0 → C4 → C5 → C6最新1. 找到共同父节点 C0
Git 会先找出 branch1 和 branch2 的共同祖先节点 C0。这通常借助 git merge-base 命令达成虽然在日常使用 git merge 时不需要手动执行该命令但 Git 内部会自动完成这个操作
# 手动获取共同父节点仅用于演示原理
common_ancestor$(git merge-base branch1 branch2)2. 计算差异
Git 会分别计算 branch1 和 branch2 相对于共同父节点 C0 的差异。它采用的是一种基于内容的差异算法也就是找出文件内容在不同版本之间的变化。具体来说
对于 branch1Git 会分析从 C0 到 branch1 最新提交 C1 期间文件内容的改动例如哪些文件被新增、修改或者删除。对于 branch2Git 会分析从 C0 到 branch2 最新提交 C2 期间文件内容的改动。
3. 应用差异
接下来Git 会尝试把 branch1 相对于 C0 的差异应用到 branch2 上。这一过程可以分为以下几种情况
无冲突情况
如果 branch1 和 branch2 的修改没有重叠也就是没有对同一文件的同一部分进行修改Git 会直接将 branch1 的修改合并到 branch2 中。例如
新增文件如果 branch1 相对于 C0 新增了一个文件Git 会在 branch2 中也创建这个文件并将其内容复制过来。修改文件如果 branch1 对某个文件进行了修改而 branch2 没有对该文件进行修改Git 会把 branch1 对该文件的修改应用到 branch2 对应的文件上。删除文件如果 branch1 相对于 C0 删除了一个文件而 branch2 没有对该文件进行修改Git 会在 branch2 中也删除这个文件。
有冲突情况
当 branch1 和 branch2 对同一文件的同一部分进行了不同的修改时就会产生冲突。Git 无法自动决定采用哪个修改因此会在冲突的文件中标记出冲突的部分。例如文件中会出现类似如下的冲突标记 HEAD
这是 branch2 中的内容这是 branch1 中的内容branch1HEAD 表示当前分支即 branch2的内容 是分隔符 branch1 表示要合并进来的分支即 branch1的内容。此时需要手动编辑这些内容选择保留哪些部分或者将两部分内容进行整合。
4. 创建合并提交
无论是否有冲突在完成差异应用后Git 都会创建一个新的合并提交。这个合并提交有两个父节点分别是 branch2 的最新提交 C2 和 branch1 的最新提交 C1。合并提交记录了合并操作的结果将两个分支的修改整合到了一起。可以使用以下命令查看合并提交的信息
git log --graph --oneline --all综上所述Git 通过找到共同父节点、计算差异、应用差异和创建合并提交这几个步骤实现了将 branch1 相对于 C0 的差异应用到 branch2 上的操作。
简单来说合并的分支与当前分支必定会有共同的父节点git会依次执行要合并的分支上的每一次提交最终与当前分支的最新一次提交一起生成一次新的提交。