假设我在不同客户的生产中同时拥有版本3和5和7,同时我们仍在为版本8开发功能。
在版本3中发现了一个错误,它已修复,版本3客户使用此修补程序获得新版本3(3.0.1或其他)。
稍后,另一个客户在版本5中发现了一个错误,它也已修复,现在我们必须制作版本5的新修补程序版本。
我们如何确保此新版本5(以及版本5的任何未来版本)包含以前版本的所有修复程序?
答案 0 :(得分:0)
假设您有version_3,version_5,version_7,它们代表分支。
version_3中固定的每个都应该用更高版本合并。
e.g
首先切换到分支版本_5
git checkout version_5
将version_3分支合并到version_5分支
git merged version_5
然后在version_7或更高版本中再次执行此操作。
您还可以使用GIT GUI通过SourceTree轻松管理git repo 或GitExtensions
有关git的更多信息:https://www.atlassian.com/git/tutorials/git-merge
答案 1 :(得分:0)
您所问的答案(如何“确定”错误已修复)的答案是测试每个版本,而不是发布展示已知错误的新版本。
您实际要求的是确保修复3中的错误的提交将包含在以后版本的任何未来版本中的过程。虽然这可能不是一个坏主意,但它并不能确保在这些版本中修复错误;这仍然是测试的责任。即便如此,您至少会希望将新的测试用例合并到每个受影响的发行版本中,并且合并来自版本3 的修复是用于修复其他版本的合理的“第一次尝试”,所以某种类型的合并模式在这里很有用。
但实际上并没有办法实现自动化。您可以采取措施,以便任何关注您工作流程的人自然会接受更改。任何试图比这更彻底的事情都可能涉及彻底的历史改写 - 这反过来会阻碍你支持现有安装基础的努力。
因此,它归结为:您保留发布分支,以便您可以将它们用于同一版本行中的后续版本。 (如果您的工作流程类似于gitflow,这可能指向主合并提交。)要启动修补程序,您需要从相应的发行版分支进行分支。此修补程序包含一个测试用例,如果没有修复程序就会失败并传递它,以及应用于该版本的修复程序。您将其合并到每个适用的版本分支中。
答案 2 :(得分:0)
我同意Mark Adelsberger的回答/评论,因为它更像是CI /测试/策略而不是git特定的东西。那说,我有一家公司有过与你类似的发布战略的经验,我会试着简要介绍一下他们这样做的方式:
如果您有3个已发布的版本且有一个正在开发中:
v1
v2
v3
v4 (pre-release)
develop branch continues with changes for v4.
他们有这样的场景:
Fix in v1 required only in v2
- Merge v1 -> v2
- Fake merge v2 -> v3 (Take the only the state of the v3 branch so git doesn't report merge conflicts in future merges).
- Fake merge v3 -> v4 (Take the only the state of the v4 branch so git doesn't report merge conflicts in future merges).
Fix in v1 required in all versions.
- Merge v1 -> v2
- Merge v2 -> v3
- Massive code refactor in v3, fake merge into v4 (take v4 changes).
- Manually apply fix V4 changes.
Fix in v4 you want back ported to v2
- Manually apply/cherry pick change into v2.
- Fake merge v2 -> v3 (Take the only the state of the v3 branch so git doesn't report merge conflicts in future merges).
- Fake merge v3 -> v4 (Take the only the state of the v4 branch so git doesn't report merge conflicts in future merges).
它产生了一些令人头疼的问题,因为您最终还是会在每个分支上进行大量测试,因为您仍然希望发布经过测试的软件。 合并设置为自动级联,但显然并非总是可行,因此您经常使用手动解决方案。
它还会导致一些关于错误/功能范围的争论,因为当代码发生巨大变化时,您通常不愿花费相当长的时间来解决合并冲突。
您将遇到类似第二个问题的情况,其中部分代码经历了完整的重构/完全移动,因此修复不再适用,或者需要以不同的方式应用。然后,您需要执行这些“假合并”,其中您实际上执行合并而不进行任何更改,以防止在应用简单更改时将来发生合并冲突。
它是可行的,而且是可管理的,但该公司得出的结论很快就开始减少支持版本的数量;或者只应用非常简单/关键的修复。
更多轶事而不是有用的答案,但评论太长= D