在 Git 中合并允许您将使用 git branch 创建的两个或多个开发工作合并到一个分支中。它合并了来自命名提交的更改并将它们分散到当前分支中。在进行合并选项之前,请确保接收分支和合并分支与最新的远程更改保持同步。
什么是合并策略?
Git 提供了多种方法来将不同的提交合并到一个基础提交中。这些方法称为合并策略。这些基本提交组合在一起形成合并提交。合并提交就像常规提交一样,除了它有两个父提交。在合并过程的多种策略中,如果没有明确指定,git 将自动选择一种。合并策略的这种自动选择基于为合并提供的分支。
有多种类型的合并策略:
- 快进
- 递归
- 我们的
- 章鱼
- 解决
- 子树
Git 合并将多个提交序列合并为一个统一的历史记录。在最常见的用例中, git merge 用于合并两个分支。根据项目的需要,可以使用任何upgiven策略来执行合并过程。最常用的策略是Fast Forward Merge和Recursive Merge 。快进合并:
在这种最常用的合并策略中,历史只是一条直线。当您创建一个分支时,在该分支中进行一些提交,当您准备好合并时,master 上没有新的合并。这样大师的指针就直接向前移动了,历史就是一条直线。
命令:
$ git rebase
递归合并:
在Recursive merge 中,在您分支并进行一些提交之后,“ master ”上会有一些新的原始提交。因此,当需要合并时,git 会在分支上递归并创建一个新的合并提交。合并提交继续有两个父级。
命令:
$ git merge--no-ff
注意:这两种策略都没有对错之分,但是使用快进合并,您有一条直线历史记录,而使用递归合并,它是多条线。
快进合并与递归合并:
Fast Forward | Recursive |
---|---|
No new commits on the master | New commits on the master |
Linear History | Commit 2 parents |
No merge commits | Merge commit is created |
git rebase | git merge–no-ff |
我们的合并:
这种合并策略可以解析任意数量的头,但合并的结果树始终是当前分支头的树,有效地忽略了所有其他分支的所有更改。它旨在用于取代侧枝的旧开发历史。
注意:此策略与“递归”合并策略的 -Xours 选项不同。
命令:
$ git merge -s ours
八达通合并:
Octopus Merge 策略解决了超过两个头的情况,但拒绝进行需要手动解决的复杂合并。它主要用于将主题分支头捆绑在一起。这是拉取或合并多个分支时的默认合并策略。
命令:
$ git merge -s octopus
解决合并:
此策略只能使用 3 路合并算法解析两个头(即当前分支和您从中拉出的另一个分支)。它试图仔细检测交叉合并的歧义,通常被认为是安全和快速的。
命令:
$ git merge -s resolve
注意: “ -s resolve ”仅解决微不足道的条件。如果分支之间的代码不同,则必须手动解决冲突。子树合并:
这是一种修改后的递归策略。合并树 A 和 B 时,如果 B 对应于 A 的子树,则首先调整 B 以匹配 A 的树结构,而不是读取同一级别的树。对共同祖先树也进行了这种调整。
命令:
$ git merge -s subtree
手动调用命名合并策略
-s
命令:
$ git merge -s recursive
$ git merge --strategy=octopus