带有额外分支
在0.59分支与0.58分支分离后,您可以使用单独的“发布”分支来管理0.58版本号的更改。每个版本(除了最新版本)都将拥有自己的“发布”分支,该分支仅包含来自基础分支的合并和更新外部版本号的更改。分支结构可能如下所示:
A--------o--B 0.58-release
/ /
...--o--o--o--o--o--o--o--o 0.58
\ \ \ \
\ \ \ \ C 0.59-release
\ \ \ \ /
o--o--o--o--o--o--o--o--o--o--o--o 0.59
\ \
o--o--o 0.60
- 软件版本“0.58 beta9”由A标记
- 软件版本“0.58 rc1”由B标记
- 0.58有未发布的更改
- 软件版本“0.59 beta1”由C标记
- 0.59有未发布的更改
- 0.60与0.59尚未完全更新
或者,如果您严格要求仅在A、B、C等处进行更改,以更改外部版本号(没有重大代码更改,这些属于“基础”分支:0.58、0.59等),则可以不使用“发布”分支。相反,您可以使用一个分离的HEAD或临时分支(在版本化后删除),以进行外部版本更新提交并将其保存在标签中。
A B
/ /
...--o--o--o--o--o--o--o--o 0.58
\ \ \ \
\ \ \ \ C
\ \ \ \ /
o--o--o--o--o--o--o--o--o--o--o--o 0.59
\ \
o--o--o 0.60
- A将软件标记为“0.58 beta9”,标签为0.58-beta9
- B将软件标记为“0.58 rc1”,标签为0.58-rc1
- C将软件标记为“0.59 beta1”,标签为0.59-beta1
类似Git的版本控制方法
你也可以看一下Git是如何进行自己的版本控制的。
对于从Git工作树中构建的版本,版本号是从git describe HEAD
的输出中生成的。 Makefile 知道哪些文件需要重新编译/重建,如果版本号更改,则始终运行 GIT-VERSION-GEN 脚本以确保它具有最新的版本号。 通过包含生成的版本文件,可以在 Makefile 中获取版本号。 它通过编译器参数(-DGIT_VERSION=…
)传递给C文件,并通过使用 sed 将其替换到脚本中。
还有一些规定,可以覆盖构建中“烧录”的版本号,但它们通常仅适用于在工作树之外进行的构建(例如,从tar文件中提取的树中进行的构建)。
将版本字符串更改与其他更改混合
在您对问题的补充中,您声明需要在开发过程中调整版本号。首先,我认为seh和我描述的“0.58-release”分支方案仍然适用于您。只是需要更多的纪律来分离您的更改。如果您将 *-release 分支视为“发布供内部测试”的分支,而不仅仅是“发布给客户(或用于外部测试)”,那么它仍然是有意义的。始终在基本分支上进行开发(例如,“0.58”),并始终将基本分支合并到发布分支(例如,“0.58-release”)中,然后再进行需要特定版本号的构建(始终从这样合并的发布分支进行构建)。
如果您坚持将版本号更改和(非合并的)代码更改放在同一行历史记录中,则在合并时似乎您将别无选择,除非您使用 git cherry-pick
(根据Damien Wilson或针对git rebase -i
的自动编辑脚本)处理冲突。
如果您的“版本文件”仅包含版本信息,则您可以使用 .gitattributes
将您的 Version.cpp
文件标记为不可合并,从而减轻冲突解决。
在包含 Version.cpp 的目录中的 .gitattributes
/Version.cpp -merge
将其标记为这样(与merge=binary
相同)将始终在合并的分支之间存在文件差异时引起冲突。合并后的工作树版本将默认为您已经检出的分支的版本(而不是您正在合并的分支/分支的版本),因此您只需git add Version.cpp && git commit
即可完成合并(假设所有其他冲突也已解决)。