git 基础之 merge 和 rebase 的比较-一、基于 merge 的合并介绍

1.1 如何使用

情景 1:

当你的代码处在分支 branch-a,而本地有另外一个分支 branch-b 的时候,使用

git merge branch-b

可以将 branch-b 分支的代码,merge 到当前所处的 branch-a 分支上。

情景 2:

当你的代码处在分支 branch-a,直接使用 git pull origin branch-b 拉取仓库中 branch-b 分支的最新代码时,默认情况下,git pull 命令执行的是 fetch 后跟 merge。也即:

git pull origin branch-b
# 等价于
git fetch origin branch-b  # 拉取远端 branch-b 的最新状态,此刻本地的 branch-b 依旧不是最新代码
git merge origin/branch-b  # 合并远端 branch-b 最新代码,此刻本地的 branch-b 依旧不是最新代码

最新版本的 git 会在项目首次 pull 时,让你设置默认的合并行为;这里说的默认选用 merge 是老版本的 git。

要全局设置 git pull 使用 merge,可以配置

git config --global pull.rebase false

下图是一个更加复杂的示例,branch-a 签出 branch-bbranch-c,按照时间顺序(图中由下到上)发生了如下事情

  1. branch-a 签出 branch-bbranch-c
  2. branch-b 提交了一次代码(节点 b1
  3. branch-c 提交了一次代码(节点 c1
  4. branch-b 提交了一次代码(节点 b2
  5. branch-c 提交了一次代码(节点 c2
  6. branch-c 被合并进了 branch-a(图中这种情况不会发生任何冲突,因为 branch-c 签出、提交、合并过程中,branch-a 并未发生代码改变)
  7. branch-b 提交了一次代码(节点 b3
  8. branch-b 被合并进了 branch-a(此时有可能发生冲突,因为 branch-bbranch-c 可能修改同一个位置的代码)
    在这里插入图片描述

1.2 合并方式

git merge 创建一个新的合并提交,它具有两个父提交,分别指向合并前两个分支的最新提交。

例如上面的例子中,branch-c 被合并进 branch-a

  • 节点 a2 就是新的合并提交
  • 节点 a1c2 就是 a2 的两个父提交

1.3 历史记录呈现形式

使用 merge 时,历史记录保持了分支形式,从而可以清晰地展示各个分支的合并点与路径。

例如上面的例子中,合并后即便删掉 branch-bbranch-c,提交历史也会保留,即: b1b2b3c1c2

1.4 冲突处理方式

如果合并时遇到冲突,Git 会停止合并过程,让用户一次性解决冲突,然后创建一个新的合并提交来完成合并过程。

上一篇:阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案-Experiments


下一篇:Docker 基础命令介绍和常见报错解决-停止容器