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-b
和 branch-c
,按照时间顺序(图中由下到上)发生了如下事情
-
branch-a
签出branch-b
和branch-c
-
branch-b
提交了一次代码(节点b1
) -
branch-c
提交了一次代码(节点c1
) -
branch-b
提交了一次代码(节点b2
) -
branch-c
提交了一次代码(节点c2
) -
branch-c
被合并进了branch-a
(图中这种情况不会发生任何冲突,因为branch-c
签出、提交、合并过程中,branch-a
并未发生代码改变) -
branch-b
提交了一次代码(节点b3
) -
branch-b
被合并进了branch-a
(此时有可能发生冲突,因为branch-b
和branch-c
可能修改同一个位置的代码)
1.2 合并方式
git merge 创建一个新的合并提交,它具有两个父提交,分别指向合并前两个分支的最新提交。
例如上面的例子中,branch-c
被合并进 branch-a
时
- 节点
a2
就是新的合并提交 - 节点
a1
和c2
就是a2
的两个父提交
1.3 历史记录呈现形式
使用 merge 时,历史记录保持了分支形式,从而可以清晰地展示各个分支的合并点与路径。
例如上面的例子中,合并后即便删掉 branch-b
和 branch-c
,提交历史也会保留,即: b1
、b2
、b3
、c1
、c2
1.4 冲突处理方式
如果合并时遇到冲突,Git 会停止合并过程,让用户一次性解决冲突,然后创建一个新的合并提交来完成合并过程。