使用分支

Git 合并策略选项和示例

一项工作已完成、经过测试并准备好合并回开发主行时,您的团队需要做出一些政策选择。您的合并策略选项有哪些?在本文中,我们将研究各种可能性,然后提供一些有关 Atlassian 运行方式的注释。希望最后您有工具来决定哪种方法最适合您的团队。

Git 合并策略

合并两个分支时会发生合并。Git 将获取两个(或更多)提交指针,并尝试在它们之间找到一个共同的基础提交。Git 有几种不同的方法来查找基本提交,这些方法被称为"合并策略"。一旦 Git 找到通用基础提交,它将创建一个新的“合并提交”,该提交组合了指定合并提交的变更。从技术上讲,合并提交是一种常规提交,恰好有两个父项提交。

除非明确指定,否则 git merge 会自动选择合并策略。可以向 git mergegit pull 命令传递一个 -s(策略)选项。-s 选项可以附加所需合并策略的名称。如果没有明确指定,Git 将根据提供的分支选择最合适的合并策略。以下是可用合并策略的列表。

递归

git merge -s recursive branch1 branch2

这在两个标题上起作用。递归是拉取或合并一个分支时的默认合并策略。此外,这可以检测和处理涉及重命名的合并,但目前无法使用检测到的副本。这是拉取或合并一个分支时的默认合并策略。

解决

git merge -s resolve branch1 branch2

这只能使用三向合并算法解决两个标题。它试图仔细检测纵横交错的合并歧义,通常被认为是安全且快速的。

Octopus

git merge -s octopus branch1 branch2 branch3 branchN

两个以上标题的默认合并策略。当多个分支传递时,octopus 会自动启动。如果合并有需要手动解决的冲突,octopus 将拒绝合并尝试。它主要用于将相似的功能分支标题捆绑在一起。

我们的策略

git merge -s ours branch1 branch2 branchN

我们的策略在 N 个分支上运行。输出合并结果始终是当前分支 HEAD 的合并结果。“我们的策略”术语意味着偏好实际上忽略了所有其他分支的所有变更。它旨在用于合并相似功能分支的历史记录。

子树

git merge -s subtree branchA branchB

这是递归策略的扩展。合并 A 和 B 时,如果 B 是 A 的子子树,则首先更新 B 以反映 A 的树结构,还会对 A 和 B 之间共享的公共祖先树进行此更新。

Git 合并策略的类型

显式合并

显式合并是默认的合并类型。“显式”部分是他们创建了新的合并提交。这会改变提交历史记录并明确显示合并是在哪里执行的。合并提交的内容也很明确,因为它显示了哪些提交是合并提交的父项提交。有些团队避免显式合并,因为可以说,合并提交会给项目历史增添“干扰”。

通过变基或快进合并进行隐式合并

合并时压缩,通常不进行显式合并

递归 Git 合并策略选项

上面介绍的“递归”策略有自己的附加操作选项子集。

ours

不要与我们的合并策略混淆。这个选项的冲突需要通过优先选择“我们的”版本来完全自动解决。如果来自其他方面的变更没有冲突,则会自动合并。

theirs

与“我们的”策略相反,在解决冲突方面,其他选择倾向于使用外来合并树。

patience

此选项会花费额外的时间来避免在不重要的匹配行上进行错误合并。当要合并的分支差异极大时,最好使用此选项。

diff-algorithim
ignore-*

    ignore-space-change
    ignore-all-space
    ignore-space-at-eol
    ignore-cr-at-eol

一组以空格字符为目标的选项。任何与传递的选项的子集相匹配的行都将被忽略。

renormalize

此选项在解析三向合并的同时,在所有 git 树上运行签出和签入操作。此选项旨在用于合并具有不同 checkin/checkout 状态的分支。

no-normalize

禁用重新规范化选项。这将覆盖 merge.renormalize 配置变量。

no-renames

此选项将在合并期间忽略重命名的文件。

find-renames=n

这是默认行为,递归合并将支持文件重命名。n 参数可用于传递重命名相似度的阈值。默认 n 值为 100%

subtree

此选项借鉴了“子树”策略。如果策略在两棵树上运行并修改如何使它们与共享祖先相匹配,则此选项改为对树的路径元数据进行操作以使它们匹配。

我们的 Git 合并政策

Atlassian 强烈偏向使用显式合并。原因很简单:显式合并提供了很好的可追溯性,并为要合并的功能提供了背景信息。绝对鼓励在共享功能分支进行审核之前重新整理本地历史记录,但这根本不会改变政策,反而会增强政策。

准备好尝试分支了吗?

试用本交互式教程。

立即开始