📜  Git 合并策略

📅  最后修改于: 2021-10-24 12:53:03             🧑  作者: Mango

在 Git 中合并允许您将使用 git branch 创建的两个或多个开发工作合并到一个分支中。它合并了来自命名提交的更改并将它们分散到当前分支中。在进行合并选项之前,请确保接收分支和合并分支与最新的远程更改保持同步。

什么是合并策略?

Git 提供了多种方法来将不同的提交合并到一个基础提交中。这些方法称为合并策略。这些基本提交组合在一起形成合并提交。合并提交就像常规提交一样,除了它有两个父提交。在合并过程的多种策略中,如果没有明确指定,git 将自动选择一种。合并策略的这种自动选择基于为合并提供的分支。

有多种类型的合并策略:

  • 快进
  • 递归
  • 我们的
  • 章鱼
  • 解决
  • 子树

Git 合并将多个提交序列合并为一个统一的历史记录。在最常见的用例中, git merge 用于合并两个分支。根据项目的需要,可以使用任何upgiven策略来执行合并过程。最常用的策略是Fast Forward MergeRecursive Merge快进合并:
快进合并策略
在这种最常用的合并策略中,历史只是一条直线。当您创建一个分支时,在该分支中进行一些提交,当您准备好合并时,master 上没有新的合并。这样大师的指针就直接向前移动了,历史就是一条直线。
命令:

$ git rebase

FF合并策略FF合并策略递归合并:
递归合并策略
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-Strategy
Octopus Merge 策略解决了超过两个头的情况,但拒绝进行需要手动解决的复杂合并。它主要用于将主题分支头捆绑在一起。这是拉取或合并多个分支时的默认合并策略。
命令:

$ git merge -s octopus

Octopus-merge-Strategy-Example解决合并:
解决合并策略
此策略只能使用 3 路合并算法解析两个头(即当前分支和您从中拉出的另一个分支)。它试图仔细检测交叉合并的歧义,通常被认为是安全和快速的。
命令:

$ git merge -s resolve

解决合并策略示例

注意:-s resolve ”仅解决微不足道的条件。如果分支之间的代码不同,则必须手动解决冲突。子树合并:
子树合并策略
这是一种修改后的递归策略。合并树 A 和 B 时,如果 B 对应于 A 的子树,则首先调整 B 以匹配 A 的树结构,而不是读取同一级别的树。对共同祖先树也进行了这种调整。
命令:

$ git merge -s subtree

子树合并策略示例手动调用命名合并策略
-s–strategy=可以多次提供这些策略,以按照应尝试的顺序指定它们。如果没有 -s 选项,则使用内置的策略列表(合并单个头时使用 git merge-recursive ,否则使用git merge-octopus)。

命令:

$ git merge -s recursive
$ git merge --strategy=octopus

手动命名策略