在Git中合并并行分支如何避免引入bug?

在Git中合并并行分支如何避免引入bug?,git,branching-and-merging,Git,Branching And Merging,我希望这听起来不要太笼统;我会尽量说得具体一些 我正在学习如何使用Git,但我不能对正在并行工作的合并分支掉以轻心(我可以理解线性工作流和线性场景中版本控制的价值,包括有多个分支进行比较,其中只有一个分支幸存下来,其他分支将被丢弃) 但我看不出并行分支如何保证没有冲突(他们称之为“集成代码和共享更改的故障安全机制”)。我认为在一个大型项目中,一个改变很有可能会破坏另一个改变,而另一个改变也很有可能会破坏另一个改变,但我读过的指南(以及后来我用到的视频)似乎只是围绕这一点 声称唯一可能的问题是当人

我希望这听起来不要太笼统;我会尽量说得具体一些

我正在学习如何使用Git,但我不能对正在并行工作的合并分支掉以轻心(我可以理解线性工作流和线性场景中版本控制的价值,包括有多个分支进行比较,其中只有一个分支幸存下来,其他分支将被丢弃)

但我看不出并行分支如何保证没有冲突(他们称之为“集成代码和共享更改的故障安全机制”)。我认为在一个大型项目中,一个改变很有可能会破坏另一个改变,而另一个改变也很有可能会破坏另一个改变,但我读过的指南(以及后来我用到的视频)似乎只是围绕这一点

声称唯一可能的问题是当人们编辑相同的代码行时(在这种情况下,Git将要求您修复冲突),但事实并非如此(我已经设法创建了一个简单的反例,在这个反例中,分支时在不同位置进行的编辑使代码在合并时出现错误,Git报告没有冲突,合并成功)

当然,您可以测试合并的代码并(可能)捕获bug,但即便如此,这也意味着有人会深入不同分支的代码来解开它(从而破坏了独立功能开发所声称的好处)


我猜它一定是以某种方式工作的(否则,Linux和其他大型项目就不可能实现了),但我一直无法找到有关你如何做出一些错误假设的信息。此外,要么你从错误的来源获得信息,要么这些错误的假设导致你误解了你获得的信息

合并并不能保证没有bug,也没有人知道他们在说什么。然而,在实践中,在一个设计良好的大型系统中,如果没有直接的代码冲突,两个补丁会互相破坏是很少见的

你绝对应该测试每个版本,包括合并结果。这是我不喜欢随意重写历史记录的原因之一(例如,依赖强制重定基址来保持历史记录完全线性的工作流):因为实际上没有人测试这些工作流产生的所有自动生成的版本。这也是为什么您需要覆盖系统定义行为的可靠单元测试的原因。(人们错误地认为测试需要“覆盖代码”;这是胡说八道。他们需要覆盖需求。)好的单元测试是快速和自动化的,所以不管怎样,每次构建都要运行它们

是的,在一个罕见的例子中,合并引入了一个bug,你必须找到它。就像当一个bug是手工引入的,没有立即被注意到,你必须找到它


git支持搜索(例如
bisect
命令),只要您通常确保保留的每个提交都是“干净”版本(生成并通过定义的测试套件),该命令就很有用.但即使如此,如果您知道合并的两个直接父级都是独立工作的,那么您通常应该能够检查合并提交和它的一个父级之间的差异,并在那里找到错误,而无需深入了解历史。

您做出了一些不好的假设。此外,您或者从rom错误的来源,或者那些错误的假设会导致你误解你得到的信息

合并并不能保证没有bug,也没有人知道他们在说什么。然而,在实践中,在一个设计良好的大型系统中,如果没有直接的代码冲突,两个补丁会互相破坏是很少见的

你绝对应该测试每个版本,包括合并结果。这是我不喜欢随意重写历史记录的原因之一(例如,依赖强制重定基址来保持历史记录完全线性的工作流):因为实际上没有人测试这些工作流产生的所有自动生成的版本。这也是为什么您需要覆盖系统定义行为的可靠单元测试的原因。(人们错误地认为测试需要“覆盖代码”;这是胡说八道。他们需要覆盖需求。)好的单元测试是快速和自动化的,所以不管怎样,每次构建都要运行它们

是的,在一个罕见的例子中,合并引入了一个bug,你必须找到它。就像当一个bug是手工引入的,没有立即被注意到,你必须找到它


git支持搜索(例如
bisect
命令),只要您通常确保保留的每个提交都是“干净”版本(生成并通过定义的测试套件),该命令就很有用.但即使如此,如果您知道合并的两个直接父级都是独立工作的,那么您通常应该能够检查合并提交和它的父级之一之间的差异,并在那里找到错误,而无需深入了解历史。

我认为您混淆了故障安全和故障预防。大多数workflows是在功能分支上执行所有代码集成和测试的结果,然后(并且只有那时)通过快进合并将经过验证和测试的代码合并到master中。这确保了不可避免的bug和中断不会被引入到项目的主线中。当然,我不是在暗示未经测试就发布软件;我只是说分支会使开发的分段和模块化方面受到影响“非线性”(在数学意义上)效应。但我想马克·阿德尔斯伯格的答案在某种程度上解决了这一问题。我刚刚意识到我可能会“过于数学化”(比如“我们如何证明它?”