适用于 master/production 但不再适用于开发分支的修补程序
Hotfixes which work for master/production, but not anymore for development branch
我想知道将 "Hotfixes" 集成到 Git 工作流程中的最佳方式是什么。
似乎 Git 工作流教程的所有建议都建议将修补程序同时拉到 Master 分支和 development/feature 分支。
但是,修复开发分支中 replaced/changed/re-factored 的生产状态的修补程序呢?
给你一个想法,我的意思是:
比如说,您将以下代码部署到生产环境
function fetchDogs() {
return cats;
}
两周后您发现您混淆了 cats
和 dogs
。您为它创建一个修补程序分支,将 cats
替换为 dogs
,将其推送到 master 并进行部署。所以,到目前为止一切顺利。
然而,想象一下,与此同时,您注意到您的函数结构无论如何都是低效的,因此在您的开发分支上,您将其更改为:
function fetchAnimals(whichAnimal) {
return animals[whichAnimal];
}
但是,您不能部署它,因为它尚未经过测试(或出于任何原因)。
因此,如果您将修补程序拉到开发分支,您可能会遇到完全不必要和多余的合并冲突。 (在我的项目中经常发生合并冲突没有足够仔细地解决导致代码中不需要的工件。)
但是,如果你不拉它,你就不能再推到 master 了。
如何解决这种情况?
(写完我的问题后,我意识到这个问题 How should gitflow hotfixes work? 可能处理的是同样的问题。但是,由于没有真正的答案,我想给它一个还是试试吧。)
合并的行为有几个作用。
首先,很明显:默认情况下,它会将文本更改从(在本例中)修补程序应用到(在本例中)dev 分支。
其次,正如您所提到的,它有助于 git 理解由(在本例中)修补程序所做的更改在(在本例中)dev 分支中得到解释。
但也许它所做的最重要的事情是:它将对修补程序所做的代码更改(自 hitfix/dev 合并基础)与对开发所做的更改(自合并基础)并排放置) 并提供审查结果的机会,并确保修补程序中所做的更改确实在 开发 [=13] =]
我认为最后一点是逻辑合并操作,而文本更改的混合只是 通常 完成该任务的一个物理操作。
现在,您反对如果合并是不必要的,并且有人错误地解析了合并,这可能会引入新的错误。好吧,好吧……但这是另一种看待它的方式。分析 dev 中的变化和 hotfix 中的变化,并决定不需要物理合并,这只是执行逻辑合并的另一种策略。而且,由于您的分析 可能没有考虑到所有因素 ,此策略也可能会出现错误。 (而且这些可能是令人尴尬的错误,因为您已经修复了它们。)除此之外,与进行物理合并相比,它还有两个缺点:
首先(再次如您所见)它没有提供 git 一种方法来了解该修补程序是否在开发中。将修补程序合并到 dev 中具有文献价值,即使您使用 ours
策略执行合并(即完全忽略修补程序)。
其次,合并到 dev 对测试有影响。就其本质而言,修补程序 必须 引入至少一个新的测试用例。即使修补程序中的 none 生产代码仍然相关,也应该将其合并到您的代码库中。 (如果重构改变了测试用例的编写方式,那就是合并的一部分。)此外,合并提交需要 运行 通过完整的测试套件(这也应该消除对合并工作不佳的任何担忧此时会引入错误。
底线是,如果您的测试足够松散以伪造我刚才所说的任何部分,那么担心如何最好地合并修补程序只是争论泰坦尼克号上的躺椅的颜色。
我能想到的最后一个可能的反对意见就是所谓的"evil merge"。如果 以某种方式 修补程序被以后对 dev 的更改所避免,但默认合并将成功自动解决 (我发现这不太可能,但对于为了争论......),然后产生非默认合并(通过使用像 ours
的策略,或通过修改合并提交,或通过使用 --no-commit
,......)可能导致一些操作的麻烦。最大的担忧是变基,在这种情况下,我认为这不太可能成为问题。但如果它让你担心,你总是可以完成自动合并,然后使用后续提交来应用 "correct" 合并状态。
我想知道将 "Hotfixes" 集成到 Git 工作流程中的最佳方式是什么。
似乎 Git 工作流教程的所有建议都建议将修补程序同时拉到 Master 分支和 development/feature 分支。
但是,修复开发分支中 replaced/changed/re-factored 的生产状态的修补程序呢?
给你一个想法,我的意思是:
比如说,您将以下代码部署到生产环境
function fetchDogs() {
return cats;
}
两周后您发现您混淆了 cats
和 dogs
。您为它创建一个修补程序分支,将 cats
替换为 dogs
,将其推送到 master 并进行部署。所以,到目前为止一切顺利。
然而,想象一下,与此同时,您注意到您的函数结构无论如何都是低效的,因此在您的开发分支上,您将其更改为:
function fetchAnimals(whichAnimal) {
return animals[whichAnimal];
}
但是,您不能部署它,因为它尚未经过测试(或出于任何原因)。
因此,如果您将修补程序拉到开发分支,您可能会遇到完全不必要和多余的合并冲突。 (在我的项目中经常发生合并冲突没有足够仔细地解决导致代码中不需要的工件。)
但是,如果你不拉它,你就不能再推到 master 了。
如何解决这种情况?
(写完我的问题后,我意识到这个问题 How should gitflow hotfixes work? 可能处理的是同样的问题。但是,由于没有真正的答案,我想给它一个还是试试吧。)
合并的行为有几个作用。
首先,很明显:默认情况下,它会将文本更改从(在本例中)修补程序应用到(在本例中)dev 分支。
其次,正如您所提到的,它有助于 git 理解由(在本例中)修补程序所做的更改在(在本例中)dev 分支中得到解释。
但也许它所做的最重要的事情是:它将对修补程序所做的代码更改(自 hitfix/dev 合并基础)与对开发所做的更改(自合并基础)并排放置) 并提供审查结果的机会,并确保修补程序中所做的更改确实在 开发 [=13] =]
我认为最后一点是逻辑合并操作,而文本更改的混合只是 通常 完成该任务的一个物理操作。
现在,您反对如果合并是不必要的,并且有人错误地解析了合并,这可能会引入新的错误。好吧,好吧……但这是另一种看待它的方式。分析 dev 中的变化和 hotfix 中的变化,并决定不需要物理合并,这只是执行逻辑合并的另一种策略。而且,由于您的分析 可能没有考虑到所有因素 ,此策略也可能会出现错误。 (而且这些可能是令人尴尬的错误,因为您已经修复了它们。)除此之外,与进行物理合并相比,它还有两个缺点:
首先(再次如您所见)它没有提供 git 一种方法来了解该修补程序是否在开发中。将修补程序合并到 dev 中具有文献价值,即使您使用 ours
策略执行合并(即完全忽略修补程序)。
其次,合并到 dev 对测试有影响。就其本质而言,修补程序 必须 引入至少一个新的测试用例。即使修补程序中的 none 生产代码仍然相关,也应该将其合并到您的代码库中。 (如果重构改变了测试用例的编写方式,那就是合并的一部分。)此外,合并提交需要 运行 通过完整的测试套件(这也应该消除对合并工作不佳的任何担忧此时会引入错误。
底线是,如果您的测试足够松散以伪造我刚才所说的任何部分,那么担心如何最好地合并修补程序只是争论泰坦尼克号上的躺椅的颜色。
我能想到的最后一个可能的反对意见就是所谓的"evil merge"。如果 以某种方式 修补程序被以后对 dev 的更改所避免,但默认合并将成功自动解决 (我发现这不太可能,但对于为了争论......),然后产生非默认合并(通过使用像 ours
的策略,或通过修改合并提交,或通过使用 --no-commit
,......)可能导致一些操作的麻烦。最大的担忧是变基,在这种情况下,我认为这不太可能成为问题。但如果它让你担心,你总是可以完成自动合并,然后使用后续提交来应用 "correct" 合并状态。