在我们的项目中,我们有并行分支。假设我们有Branch_A和Branch_B。如果一个开发人员将更改合并到Branch_A中的文件abc.js,另一个开发人员将他们的更改合并到Branch_B中的同一个abc.js文件。目前,我们每周收集所有合并冲突,开发人员需要手动将其更改从分支_A合并到分支_B。在忙碌周内,这种手动合并非常繁琐,并导致分支_B的截止日期延迟。有没有什么方法可以自动解决代码合并冲突?我们无法提出一个自动化的代码冲突解决框架。
im9ewurl1#
合并冲突无法自动解决,因为Git已经自动执行合并,合并冲突就是那些 * 无法自动合并 * 的合并。因此,合并冲突不能自动解决的说法 * 同义反复为真 *,因为术语 merge conflict 的 * 定义 * 是它是一个不能由Git自动执行的合并。然而,有一些方法可以提高Git的自动化能力。
最简单的方法是激活Git的rerere (reuse recorded resolution)功能。Rerere不能 * 自动解决合并冲突,但它可以确保相同的冲突只需要手动解决一次。The way rerere works是它 * 记录 * 如何手动解决冲突 *,然后在每次相同的合并冲突再次出现时 * 重复使用 * 此手动解决方法。这不会消除合并冲突,但会减少重复解决同一冲突的次数。任何执行合并的git命令都会自动为您运行git rerere(如果启用)。
git rerere
一个 merge driver 告诉Git如何合并整个文件。有一些内置的低级驱动程序,但您可以轻松提供自己的驱动程序。如果你有一个更好的方法来合并文件,而不是简单地做文本,你可以写自己的驱动程序,并使用它来合并这些文件。例如,如果你在一个CSV文件中添加了一个列,这将改变文件中的每一行。如果你有另一个修改,删除了一行,Git标准的基于行的合并驱动程序将无法自动合并这两个修改。但是一个专门了解CSV文件语义的合并驱动程序可以很容易地做到这一点。另一个例子是XML、HTML、JSON、YAML或其他结构化和半结构化数据序列化格式。拥有一个在对象图而不是文本文件上操作的合并驱动程序可能是一个重大的改进。当然,对于用编程语言编写的代码,自定义合并驱动程序可以检测Refactorings(如Pull Up Method或Change Function Declaration),并通过组合这些重构而不是组合基于行的文本更改来执行合并。
与您自己的合并驱动程序类似,您也可以提供自己的merge strategy.A merge strategy foo is nothing more than an executable utility git-merge-foo placed in the current $PATH。如果你有Git没有的关于分支的额外上下文信息,提供你自己的合并策略可以让你合并Git自己不知道如何合并的更改。
foo
git-merge-foo
$PATH
你可以选择不同的 *diff算法 *。虽然我不是100%清楚diff算法如何影响合并的行为,但文档表明它们确实如此。
1条答案
按热度按时间im9ewurl1#
合并冲突无法自动解决,因为Git已经自动执行合并,合并冲突就是那些 * 无法自动合并 * 的合并。
因此,合并冲突不能自动解决的说法 * 同义反复为真 *,因为术语 merge conflict 的 * 定义 * 是它是一个不能由Git自动执行的合并。
然而,有一些方法可以提高Git的自动化能力。
rerere
最简单的方法是激活Git的rerere (reuse recorded resolution)功能。
Rerere不能 * 自动解决合并冲突,但它可以确保相同的冲突只需要手动解决一次。The way rerere works是它 * 记录 * 如何手动解决冲突 *,然后在每次相同的合并冲突再次出现时 * 重复使用 * 此手动解决方法。
这不会消除合并冲突,但会减少重复解决同一冲突的次数。任何执行合并的git命令都会自动为您运行
git rerere
(如果启用)。合并驱动
一个 merge driver 告诉Git如何合并整个文件。有一些内置的低级驱动程序,但您可以轻松提供自己的驱动程序。
如果你有一个更好的方法来合并文件,而不是简单地做文本,你可以写自己的驱动程序,并使用它来合并这些文件。
例如,如果你在一个CSV文件中添加了一个列,这将改变文件中的每一行。如果你有另一个修改,删除了一行,Git标准的基于行的合并驱动程序将无法自动合并这两个修改。但是一个专门了解CSV文件语义的合并驱动程序可以很容易地做到这一点。
另一个例子是XML、HTML、JSON、YAML或其他结构化和半结构化数据序列化格式。拥有一个在对象图而不是文本文件上操作的合并驱动程序可能是一个重大的改进。
当然,对于用编程语言编写的代码,自定义合并驱动程序可以检测Refactorings(如Pull Up Method或Change Function Declaration),并通过组合这些重构而不是组合基于行的文本更改来执行合并。
合并策略
与您自己的合并驱动程序类似,您也可以提供自己的merge strategy.A merge strategy
foo
is nothing more than an executable utilitygit-merge-foo
placed in the current$PATH
。如果你有Git没有的关于分支的额外上下文信息,提供你自己的合并策略可以让你合并Git自己不知道如何合并的更改。
diff算法
你可以选择不同的 *diff算法 *。虽然我不是100%清楚diff算法如何影响合并的行为,但文档表明它们确实如此。