合并 (版本控制)

✍ dations ◷ 2025-07-04 15:53:30 #版本控制系统,版本控制,形态管理

在版本控制中,合并(英语:merging),也称为整合(integration),是指当一个文件在多个独立分支中被修改后如何合并这些修改成为一个文件的操作。

合并可以是版本控制软件自动执行,但如果有冲突(英语:conflict (version control)),就需要考虑手工合并。

合并算法是一个热点研究领域,有多种不同的算法。

三路合并(three-way merge),首先考虑对文件A、文件B以及它们的共同祖先文件C做差异分析。对于文件中的每节(sector),如果上述三个文件中有两个文件该节的内容一致,那么抛弃文件C中该节的内容,保留与文件C中不同的内容放到结果文件中。如果该节在三个文件中都不同,那么这个冲突需要手工合并。

三路合并被程序diff3(英语:diff3)实现,是基于文件锁的版本控制系统到基于合并的版本控制系统转变的核心。被CVS广泛使用.

三路合并算法的基础技术是找到被合并文件的共同祖先文件。在遇到十字交叉合并(criss-cross merge)时,不存在独一无二最小共同祖先。

Git采取了递归三路合并(Recursive three-way merge),对没有共同祖先的一对文件递归创建虚拟祖先。这一方法还可以用于有向无环图。

修补包是一个文件,包含另一个文件的改变的描述。Unix传统使用修补包传播一个文本文件的改变,这个修补包可用命令"diff -u"生成,然后用命令patch把修补包应用到一个文本文件。

但patch程序也可以把一个修补包用于与最初产生该包的文件不是完全相同的文件。这称作模糊修补包应用(fuzzy patch application)。 GNU arch采用了这种方法。但模糊修补包应用是一种不太可信的办法,在上下文太少情况下可能会误用。

编织合并(Weave merge)算法跟踪每行是被增加或是删除,产生结果信息。如果在一个版本中该行被删除,则结果文件就不包含该行。BitKeeper、GNU Bazaar、Codeville采用了此方法,对三路合并出错的情形能产生正确结果。

修补包交换(Patch commutation)改变修补包的应用顺序,形成一线性历史。效果上,当两个修补包产生于同一个环境,合并时,一个修补包被重写以便它可以在另一个修补包执行完毕后才使用。例如,修补包A在文件F的行7之后增加了行"X",修补包B在文件F的行310之后增加了行"Y",B需要重写为对文件F的行311之后增加行"Y",以便能在修补包A使用后再使用修补包B。

Darcs、Git (称作"rebasing")采用了这一方法。

"patchutils" package中的Unix程序flipdiff实现了修补包交换.

相关

  • Cu(PhCOO)sub2/sub苯甲酸铜是一种无机化合物,化学式为Cu(C6H5CO2)2。该化合物有时会用作烟火中的蓝光源。实验室里,苯甲酸铜可以由苯甲酸钾和硫酸铜反应得到:苯甲酸铜有至少两种结构,其结构取决于
  • 超氧化钠超氧化钠是一个橙黄色的固体,化学式为NaO2,含有超氧离子O2−。超氧化钠为石盐结构,可由过氧化钠与氧气在加压情况下反应制备:用氧气与钠的液氨溶液小心反应也会得到超氧化钠:超氧
  • 浊双唇内爆音浊双唇内爆音是一种辅音。其发音方式为双唇与声门同时关闭的状态下,让喉头位置下降,从而使声道中产生气流。同时开放双唇发出的一种辅音。国际音标中以 /ɓ/ 来表记此音。越南
  • 拉尤河拉尤河(Layou River)是加勒比海岛国多米尼克的一个河流,发源于该国的内陆,向西流入该国中西海岸的加勒比海,非常靠近圣约瑟夫。为多米尼克最长和最深的河流。坐标:15°23′N 61°2
  • A10公路A10公路、A10高速公路可以指:
  • 白拉姆汗白拉姆汗(或译白兰汗;波斯语:بيرام خان‎)逝于1561年,生前为一位握有至高权力的突厥裔人。他是出身于东安那托利亚(今土耳其)和阿塞拜疆的贵族,自其祖父与父亲即于蒙兀儿帝
  • 田际云田际云(1864年-1925年),原名麟瑞,后改名瑞麟,乳名虎儿,艺名响九霄(原为想九宵,又作想九霄、响九箫),原籍河北高阳县,出生于河北省定兴县。河北梆子演员、戏剧活动家。田际云幼时就渎于村
  • 粘核毛桃粘核毛桃(学名: var. )为蔷薇科李属下的一个变种。
  • 梶原武雄梶原武雄(1923年2月25日-2009年11月28日),日本新潟县人,日本棋院九段棋士;关山利一九段门下。由于具有优秀的大局观以及对棋形执著的求道精神,再加上给予年轻棋士的熏陶,因此带给围
  • 马林·西里奇马林·西里奇(克罗地亚语:Marin Čilić,1988年9月28日-),生于南斯拉夫联邦时期波黑,当今克罗地亚最佳男子网球选手,单打最高世界排名第3,至今赢得1座大满贯金杯,是克罗地亚第二位网球