一种代码冲突合并方法、系统、电子设备及可读存储介质转让专利

申请号 : CN202210776325.3

文献号 : CN114840250B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 谢玉鑫邵明腾胡士猛胡翠梅

申请人 : 金现代信息产业股份有限公司

摘要 :

本发明公开一种代码冲突合并方法、系统、电子设备及可读存储介质,涉及数据处理技术领域,包括:在原始版本、第一修改版本和第二修改版本中添加含有合并策略指令的标记信息;将标记后的三个版本经树状结构解析后得到各自的文本合并结构树;将文本合并结构树中的嵌套子级进行层级折叠后进行代码合并,对存在代码冲突的区域,根据合并策略指令进行代码合并;代码合并完成后,得到合并结果,所述合并结果为第一修改版本的修改被全部接受后的合并结果,或第二修改版本的修改被全部接受后的合并结果。降低开发人员手动处理代码冲突合并的频率和数量,提高自动处理代码冲突的能力,减轻开发人员负担。

权利要求 :

1.一种代码冲突合并方法,其特征在于,包括:

根据业务场景的不同,预先设置在特定场景下的合并策略,在原始版本、第一修改版本和第二修改版本中添加含有合并策略指令的标记信息;标记信息为:/* @begin ‑‑option identifier */// 标记区域内代码

/* @end */

其中,@begin注释行表示为标记区域的开始,@end注释行表示为标记区域的结束,‑‑开头表示为指定的指令参数,identifier为位置参数,表示标记区域的全局唯一标识符;

将标记后的三个版本经树状结构解析后得到各自的文本合并结构树;树状结构解析的过程包括:扫描含有合并策略指令的注释行,通过@begin/@end指令的压栈和出栈构造树状结构;

将文本合并结构树中的嵌套子级进行层级折叠后进行代码合并,对存在代码冲突的区域,根据合并策略指令进行代码合并;

代码合并完成后,得到合并结果,所述合并结果为第一修改版本的修改被全部接受后的合并结果,或第二修改版本的修改被全部接受后的合并结果。

2.如权利要求1所述的一种代码冲突合并方法,其特征在于,@begin和@end为配对结构,支持多级嵌套,用于标记区域的开始和结束。

3.如权利要求2所述的一种代码冲突合并方法,其特征在于,在标记区域开始的注释行内,添加合并策略指令。

4.如权利要求1所述的一种代码冲突合并方法,其特征在于,将合并结果中的层级折叠部分,通过区域标识符递归展开子层级。

5.如权利要求4所述的一种代码冲突合并方法,其特征在于,折叠是将当前待合并节点下,所有根级节点折叠为一个引用指令;展开是将引用指令按照区域标识符解引用。

6.如权利要求1所述的一种代码冲突合并方法,其特征在于,对没有代码冲突的区域,第一修改版本和第二修改版本的修改均全部接受。

7.一种代码冲突合并系统,其特征在于,包括:

标记模块,被配置为根据业务场景的不同,预先设置在特定场景下的合并策略,在原始版本、第一修改版本和第二修改版本中添加含有合并策略指令的标记信息;标记信息为:/* @begin ‑‑option identifier */// 标记区域内代码

/* @end */

其中,@begin注释行表示为标记区域的开始,@end注释行表示为标记区域的结束,‑‑开头表示为指定的指令参数,identifier为位置参数,表示标记区域的全局唯一标识符;

解析模块,被配置为将标记后的三个版本经树状结构解析后得到各自的文本合并结构树;树状结构解析的过程包括:扫描含有合并策略指令的注释行,通过@begin/@end指令的压栈和出栈构造树状结构;

合并模块,被配置为将文本合并结构树中的嵌套子级进行层级折叠后进行代码合并,对存在代码冲突的区域,根据合并策略指令进行代码合并;

输出模块,被配置为代码合并完成后,得到合并结果,所述合并结果为第一修改版本的修改被全部接受后的合并结果,或第二修改版本的修改被全部接受后的合并结果。

8.一种电子设备,其特征在于,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成权利要求1‑6任一项所述的方法。

9.一种可读存储介质,其特征在于,用于存储计算机指令,所述计算机指令被处理器执行时,完成权利要求1‑6任一项所述的方法。

说明书 :

一种代码冲突合并方法、系统、电子设备及可读存储介质

技术领域

[0001] 本发明涉及数据处理技术领域,特别是涉及一种代码冲突合并方法、系统、电子设备及可读存储介质。

背景技术

[0002] 在代码开发过程中,三路合并算法是指:基于同一版本的代码分别进行两次不同的编辑修订,按照文本行分别比较出两个修订版本相对于共同原始版本存在差异的行数,再将这两份差异对齐,将两份差异版本合并为一个新版本代码。
[0003] 此时,如果存在一块区域,同时被这两次不同的编辑修订进行修改,则将该区域判定为代码冲突,由开发人员手工处理代码冲突的区域;否则,只需要自动合并两份差异就可以完成合并。
[0004] 由于实际业务的复杂性,可能会同时遇到“先可视化编辑业务模块之后再生成代码”以及“开发人员手工修改代码功能”这两种可能引发代码内容变动的情况,难以避免出现代码冲突。那么,在这样的业务场景下,如果使用传统的三路合并算法,开发人员会频繁地遇到需要手工处理代码冲突合并的情况。
[0005] 此外,由于传统三路合并算法基于共同原始版本进行比较,如果不额外处理的话,每次在出现代码冲突时的合并,都需要将以往处理过的冲突再重新处理一遍,在开发复杂页面和业务时影响开发进度。

发明内容

[0006] 为了解决上述问题,本发明提出了一种代码冲突合并方法、系统、电子设备及可读存储介质,降低开发人员手动处理代码冲突合并的频率和数量,提高自动处理代码冲突的能力,减轻开发人员负担。
[0007] 为了实现上述目的,本发明采用如下技术方案:
[0008] 第一方面,本发明提供一种代码冲突合并方法,包括:
[0009] 在原始版本、第一修改版本和第二修改版本中添加含有合并策略指令的标记信息;
[0010] 将标记后的三个版本经树状结构解析后得到各自的文本合并结构树;
[0011] 将文本合并结构树中的嵌套子级进行层级折叠后进行代码合并,对存在代码冲突的区域,根据合并策略指令进行代码合并;
[0012] 代码合并完成后得到合并结果,所述合并结果为第一修改版本的修改被全部接受后的合并结果,或第二修改版本的修改被全部接受后的合并结果。
[0013] 作为可选择的实施方式,树状结构解析的过程包括:扫描含有合并策略指令的注释行,通过@begin/@end指令的压栈和出栈构造树状结构。
[0014] 作为可选择的实施方式,@begin和@end为配对结构,支持多级嵌套,用于标记区域的开始和结束。
[0015] 作为可选择的实施方式,在标记区域开始的注释行内,添加合并策略指令。
[0016] 作为可选择的实施方式,将合并结果中的层级折叠部分,通过区域标识符递归展开子层级。
[0017] 作为可选择的实施方式,折叠是将当前待合并节点下,所有根级节点折叠为一个引用指令;展开是将引用指令按照区域标识符解引用。
[0018] 作为可选择的实施方式,对没有代码冲突的区域,第一修改版本和第二修改版本的修改均全部接受。
[0019] 第二方面,本发明提供一种代码冲突合并系统,包括:
[0020] 标记模块,被配置为在原始版本、第一修改版本和第二修改版本中添加含有合并策略指令的标记信息;
[0021] 解析模块,被配置为将标记后的三个版本经树状结构解析后得到各自的文本合并结构树;
[0022] 合并模块,被配置为将文本合并结构树中的嵌套子级进行层级折叠后进行代码合并,对存在代码冲突的区域,根据合并策略指令进行代码合并;
[0023] 输出模块,被配置为代码合并完成后得到合并结果,所述合并结果为第一修改版本的修改被全部接受后的合并结果,或第二修改版本的修改被全部接受后的合并结果。
[0024] 第三方面,本发明提供一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成第一方面所述的方法。
[0025] 第四方面,本发明提供一种可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成第一方面所述的方法。
[0026] 与现有技术相比,本发明的有益效果为:
[0027] 本发明提出一种代码冲突合并方法、系统、电子设备及可读存储介质,通过预设合并策略,对存在代码冲突的区域自动进行代码合并,降低开发人员手动处理代码冲突合并的频率和数量,提高自动处理代码冲突的能力,减轻开发人员负担。自动处理代码冲突,避免每次冲突时,再次重复处理已合并的内容,避免不必要的合并冲突。
[0028] 本发明附加方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

[0029] 构成本发明的一部分的说明书附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。
[0030] 图1为本发明实施例1提供的代码冲突合并方法流程图。

具体实施方式

[0031] 下面结合附图与实施例对本发明做进一步说明。
[0032] 应该指出,以下详细说明都是示例性的,旨在对本发明提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本发明所属技术领域的普通技术人员通常理解的相同含义。
[0033] 需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本发明的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
[0034] 在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
[0035] 实施例1
[0036] 本实施例提供一种代码冲突合并方法,包括:
[0037] 在原始版本、第一修改版本和第二修改版本中添加含有合并策略指令的标记信息;
[0038] 将标记后的三个版本经树状结构解析后得到各自的文本合并结构树;
[0039] 将文本合并结构树中的嵌套子级进行层级折叠后进行代码合并,对存在代码冲突的区域,根据合并策略指令进行代码合并;
[0040] 代码合并完成后得到合并结果,所述合并结果为第一修改版本的修改被全部接受后的合并结果,或第二修改版本的修改被全部接受后的合并结果。
[0041] 在本实施例中,根据业务场景的不同,预先设置在特定场景下的合并策略,在出现代码冲突时,根据合并策略自动进行代码合并,降低需要手工解决冲突的频率。
[0042] 由于代码整体结构较为固定,不会发生大的变化,因此还可以在不影响代码执行效果的同时,在代码中插入标记信息,该标记信息包含有特定场景下的合并策略指令,以在代码合并过程中进行识别,从而自动合并;
[0043] 例如:
[0044] /* @begin ‑‑option identifier */
[0045] // 区域内代码
[0046] /* @end */
[0047] 其中,@begin注释行表示为标记区域开始,‑‑或‑开头表示为指定指令参数(例如‑‑merge,为合并策略参数,该区域内的代码根据指定的合并策略在代码冲突时进行合并),指令参数可以携带位置参数(比如区域的全局唯一标识符identifier);@end注释行表示为标记区域结束,@end和@begin组成两两配对的结构,支持多级嵌套。
[0048] 作为可选择的一种实施方式,标记信息除了直接添加在代码中,也可以记录在单独的文件中或者数据库中。
[0049] 在本实施例中,获取原始版本P1、第一修改版本F1和第二修改版本P2;其中,原始版本P1为上一次发布的版本,将其作为比较的基准;第二修改版本P2为当前发布的版本,当前发布的版本较上一次发布的版本进行了修改;第一修改版本F1为当前实际的版本,如经开发人员手工修改代码后使用的实际版本,开发人员在上一最终版本的基础上进行修改。
[0050] 将第一修改版本F1和第二修改版本P2与原始版本P1对比后,判断是否存在代码冲突的区域,对无代码冲突的区域进行差异对齐合并,对有代码冲突的区域,采用预先设置的合并策略进行代码合并后,生成新版本发布。
[0051] 在本实施例中,预先设置的合并策略涉及三个输出,即:是否检测到无法合并的冲突CONFLICT、第一修改版本F1的修改被全部接受得到的合并结果Mf、第二修改版本P2的修改被全部接受得到的合并结果Mp;
[0052] 具体地,对齐第一修改版本F1和第二修改版本P2与原始版本P1的差异align(diff(P1,F1),diff(P1,P2)),得到对齐结果列表[(Sp1_0,Sf1_0,Sp2_0),…,(Sp1_i,Sf1_i,Sp2_i),…],每项都是三个版本对齐的一块区域,对齐结果列表中的顺序是原始版本里的先后顺序;
[0053] 若存在一个区域,当且仅当Sp1_i≠Sf1_i且Sp1_i≠Sp2_i时,该区域存在代码冲突;
[0054] 比如存在区域1,第二修改版本P2没有修改,第一修改版本F1有修改,则合并后该区域采用第一修改版本F1的修改;再比如存在区域2,第二修改版本P2有修改,第一修改版本F1没有修改,则合并后该区域采用第二修改版本P2的修改;再比如存在区域3,第二修改版本P2和第一修改版本F1均有修改,则区域3存在代码冲突。
[0055] 遍历对齐结果列表,对于存在代码冲突的区域,经代码合并后产生两个不同的输出,即采用第一修改版本F1的修改和采用第二修改版本P2的修改;没有代码冲突的区域,直接采用有差异的版本。
[0056] 然后,将每个区域的输出进行拼接,就得到两个合并结果,即第一修改版本F1的修改被全部接受得到的合并结果Mf和第二修改版本P2的修改被全部接受得到的合并结果Mp;
[0057] 比如,原始版本P1存在区域1、区域2、区域3,在第二修改版本P2中修改了区域1和区域3,在第一修改版本F1中修改了区域2和区域3,则Mp为区域1和区域3采用第二修改版本P2的修改,区域2采用第一修改版本F1的修改,此时,第二修改版本P2的修改被全部接受。
[0058] 另一种合并结果Mf为区域2和区域3采用第一修改版本F1的修改,区域1采用第二修改版本P2的修改,此时,第一修改版本F1的修改被全部接受。
[0059] 在本实施例中,在对齐第一修改版本F1和第二修改版本P2与原始版本P1的差异时,若没有代码冲突的区域(CONFLICT=false),则直接将差异合并,第一修改版本F1和第二修改版本P2的修改均全部接受。
[0060] 在本实施例中,经上述合并策略后,若仍有无法自动合并的代码冲突(CONFLICT=true),则由人工进行处理,写入人工处理结果;该方法避免直接由人工处理代码冲突,在仍有无法自动解决的代码冲突时,才由人工处理,减少人工处理的数量。
[0061] 在本实施例中,基于上述合并策略的代码冲突合并方法,如图1所示,包括:
[0062] (1)获取原始版本P1、第一修改版本F1和第二修改版本P2,在三个版本代码中添加含有合并策略指令的标记信息;根据代码结构,将标记后的三个版本分别解析成树状结构,得到各自的文本合并结构树;
[0063] 具体地,解析树状结构的过程包括:采用全局法扫描识别含有合并策略指令的注释行,直接通过@begin/@end指令压栈、出栈即可构造树状结构。
[0064] (2)将文本合并结构树中的所有嵌套子级进行层级折叠,将三个版本各自的文本合并结构树经折叠层级后转化为文本中间结构;
[0065] 对文本中间结构进行三路合并,判断是否有存在代码冲突的区域,对代码冲突的区域根据合并策略指令进行代码合并;
[0066] 完成代码合并后,得到合并结果;即,第一修改版本F1的修改被全部接受得到的合并结果Mf,或第二修改版本P2的修改被全部接受得到的合并结果Mp。
[0067] (3)代码合并完成之后,判断是否有无法合并的冲突CONFLICT,若有,则该冲突所在区域存在无法自动处理的代码差异,由开发人员手工处理。
[0068] (4)将合并结果中的层级折叠部分,通过区域标识符递归展开子层级,最终得到所有结果。
[0069] 其中,折叠是将当前待合并节点下,所有根级节点折叠成一个引用指令@reference,比如将树:
[0070] piece_0
[0071] /* @begin node_0 */
[0072]   piece_1
[0073]   /* @begin node_1 */
[0074]     piece_2
[0075] /* @end */
[0076]   piece_3
[0077] /* @end */
[0078] piece_4
[0079] 折叠成数组:
[0080] piece_0
[0081] /* @reference node_0 */
[0082] piece_4
[0083] 反过来,展开是把@reference指令按照区域标识符解引用,将数组转回树。
[0084] 在本实施例中,业务场景内的大部分常见代码冲突可自动解决,无需手工解决,根据预先插入合并策略,在发生代码冲突的区域自动根据合并策略进行合并,也就是业务代码如何进行合并已经被提前写入代码中,降低手工处理的频率。
[0085] 实施例2
[0086] 本实施例提供一种代码冲突合并系统,包括:
[0087] 标记模块,被配置为在原始版本、第一修改版本和第二修改版本中添加含有合并策略指令的标记信息;
[0088] 解析模块,被配置为将标记后的三个版本经树状结构解析后得到各自的文本合并结构树;
[0089] 合并模块,被配置为将文本合并结构树中的嵌套子级进行层级折叠后进行代码合并,对存在代码冲突的区域,根据合并策略指令进行代码合并;
[0090] 输出模块,被配置为代码合并完成后得到合并结果,所述合并结果为第一修改版本的修改被全部接受后的合并结果,或第二修改版本的修改被全部接受后的合并结果。
[0091] 此处需要说明的是,上述模块对应于实施例1中所述的步骤,上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例1所公开的内容。需要说明的是,上述模块作为系统的一部分可以在诸如一组计算机可执行指令的计算机系统中执行。
[0092] 在更多实施例中,还提供:
[0093] 一种电子设备,包括存储器和处理器以及存储在存储器上并在处理器上运行的计算机指令,所述计算机指令被处理器运行时,完成实施例1中所述的方法。为了简洁,在此不再赘述。
[0094] 应理解,本实施例中,处理器可以是中央处理单元CPU,处理器还可以是其他通用处理器、数字信号处理器DSP、专用集成电路ASIC,现成可编程门阵列FPGA或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0095] 存储器可以包括只读存储器和随机存取存储器,并向处理器提供指令和数据、存储器的一部分还可以包括非易失性随机存储器。例如,存储器还可以存储设备类型的信息。
[0096] 一种可读存储介质,用于存储计算机指令,所述计算机指令被处理器执行时,完成实施例1中所述的方法。
[0097] 实施例1中的方法可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器、闪存、只读存储器、可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。为避免重复,这里不再详细描述。
[0098] 本领域普通技术人员可以意识到,结合本实施例描述的各示例的单元即算法步骤,能够以电子硬件或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
[0099] 上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。