Git合并策略选项及示例

在工作分支开发并且测试完成之后,对于如何将工作分支合并回主线分支,团队通常会有一些可选方式。你们团队使用什么样的合并策略?在本文中我们会分别介绍几种合并策略,以及对应的简单评述。以便在本文结束时,您可以根据团队情况选择合适的合并策略。

Git合并策略

每当我们尝试整合两个分支时,就需要用到合并操作。Git会尝试通过两个分支的commit指针,分别向前追溯,找到这两个commit指针在历史上最近的一次共同提交点。Git有几种不同的方法用来寻找这个共同提交,而这些方法就是所谓的“合并策略”。一旦Git找到这个共同提交就会创建一个新的“合并提交”,这个合并提交中的内容就是对于两个分支之间不同内容的合并。事实上一个合并提交本身也是一个不同的提交,只不过这次提交来自于两个父级提交。

what-is-a-merge.gif

git merge命令在进行合并操作时,如果没有被显式指定合并策略,则会自动选择一种合并方式。在执行git mergegit 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

此选项是子树策略的更高级形式,其中策略猜测两个树在合并时必须如何移位以相互匹配。相反,指定的路径是前缀(或从头开始剥离),以使两个树的形状匹配。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 主要是看他的Merge细节部分,讲的很好 Git的git-merge是在Git中频繁使用的一个命令,很多人都觉得g...
    yichen_china阅读 11,563评论 0 0
  • 本文转载自Git-工具-高级合并[https://git-scm.com/book/zh/v2/Git-%E5%B...
    清宵寒夜阅读 343评论 0 0
  • git-merge完全解析 Git的git-merge是在Git中频繁使用的一个命令,很多人都觉得git合并是一个...
    Chuckiefan阅读 405,328评论 13 111
  • 1,查看所有远程分支:%git branch -r 2, 拉取远程分支并创建本地分支git checkout -...
    will666阅读 2,061评论 0 18
  • git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git b...
    猿万阅读 5,046评论 1 45