在工作分支开发并且测试实现之后,对于如何将工作分支合并回主线分支,团队通常会有一些可选形式。你们团队应用什么样的合并策略?在本文中咱们会别离介绍几种合并策略,以及对应的简略评述。以便在本文完结时,您能够依据团队状况抉择适合的合并策略。
Git 合并策略
每当咱们尝试整合两个分支时,就须要用到合并操作。Git 会尝试通过两个分支的 commit 指针,别离向前追溯,找到这两个 commit 指针在历史上最近的一次独特提交点。Git 有几种不同的办法用来寻找这个独特提交,而这些办法就是所谓的“合并策略”。一旦 Git 找到这个独特提交就会创立一个新的“合并提交”,这个合并提交中的内容就是对于两个分支之间不同内容的合并。事实上一个合并提交自身也是一个不同的提交,只不过这次提交来自于两个父级提交。git merge
命令在进行合并操作时,如果没有被显式指定合并策略,则会主动抉择一种合并形式。在执行 git merge
和git pull
命令时,能够传递一个 -s (也就是 strategy 的缩写) 选项。跟在 -s
选项之后的是指定的合并策略名称。如果没有指定的话,Git 会依据合并操作所波及的分支自行抉择一个最合适的合并策略。上面是对于合并策略选项的可选值形容。
Recursive
git merge -s recursive branch1 branch2
递归合并策略在两个分支的顶端发展操作。递归策略是应用 pull
或者 merge
命令合并分支时的默认合并策略。此外这种合并策略能够在合并过程中解决重命名操作,但不能完满解决复制出的文件。
Resolve
git merge -s resolve branch1 branch2
该策略应用三路合并算法来解析两个分支之间的差别。这种办法会小心的检测呈现在十字穿插合并情况中产生的歧义,该办法通常被认为是平安且高效的。
Octopus
git merge -s octopus branch1 branch2 branch3 branchN
当须要合并的分支多于两个时,octopus 策略就称为合并时的默认策略。在合并过程中一旦呈现须要手动解决的抵触,octopus 合并就会回绝合并。这种策略通常用于合并一堆性能相似的开发分支。
Ours
git merge -s ours branch1 branch2 branchN
ours 策略能够用于合并 N 个不同分支。合并的后果总是以以后分支的 HEAD
指针为基准。策略名称“ours”字面上也暗示着合并过程中会疏忽来自于其余分支的改变。该策略用于合并内容类似的开发分支,疏忽被合并分支的内容,仅保留合并记录。
Subtree
git merge -s subtree branchA branchB
该策略是基于 recursive 策略的一种扩大策略。当合并 A 和 B 分支时,如果 B 分支是 A 分支的一个 subtree,B 分支须要首先更新子树 B 的更新记录,并将其反映在分支 A 中。这一系列更新也是基于 A 和 B 的独特先人进行判断。
Git 合并策略的品种
显式合并
显式合并是默认的合并类型。所谓“显式”意味着在合并时会特意创立一个合并提交。创立的合并提交会显式在提交历史中,并且明确显示合并被执行的工夫点。合并提交的内容也同样是显式的,因为通过合并提交产生的提交历史,能够明确看出哪些提交内容来自于哪个分支的提交。有些团队会防止应用显式合并,因为有争执认为合并提交会向提交历史中减少过多的“乐音”。
通过 rebase 或者 fast-forward 实现隐式合并
Recursive 合并策略的相干选项
在下面介绍过的 recursive 策略中,其本身还有一组操作选项
ours
不要将该选项与 ours 合并策略混同。ours 合并策略会疏忽合并分支的所有改变,而 recursive 策略中的 ours 选项只会在合并过程中发生冲突的情况下疏忽合并分支的改变,而无条件的主动保留指标分支的改变。当合并过程中没有抵触产生时,来自于合并分支的改变依然会主动合并进指标分支。
theirs
与 ours 选项相同。”theirs” 选项会在抵触产生时无条件抉择应用合并分支的内容,放弃指标分支的改变。
patience
patience 抉择会花更多的工夫对一些代码行进行更精准的合并操作,以防止产生合并之后的错行漏行之类的景象产生。
diff-algorithim
ignore-*
ignore-space-change
ignore-all-space
ignore-space-at-eol
ignore-cr-at-eol
下面的选项是针对如何解决空白字符的策略。
renormalize
在解析三向合并时,这将运行虚构签出并检入文件的所有三个阶段。
no-normalize
禁用 renormalize
选项。这会笼罩 merge.renormalize
配置变量。
no-renames
敞开重命名检测。这会笼罩 merge.renames
配置变量。
find-renames=n
关上重命名检测,可抉择设置相似性阈值。这是默认值。这会笼罩 merge.renames 配置变量。
subtree
此选项是_子树_策略的更高级模式,其中策略猜想两个树在合并时必须如何移位以互相匹配。相同,指定的门路是前缀(或从头开始剥离),以使两个树的形态匹配。