git - 将事物合并到生产/发布分支的正确方法是什么?
问题描述
我和我的团队目前正在做一个小项目。
为了正确地做事,我们正在尝试遵循类似于https://nvie.com/posts/a-successful-git-branching-model/中描述的 git 分支模型:
但是,与图片上显示的一个关键区别在于hotfixes
分支:
- 当生产中出现错误时,我们必须尽快修复该行为,并且我们通常必须通过临时解决方案(不应该保持硬编码的硬编码内容等)来做到这一点。开发此解决方案
hotfixes
然后合并到master
(这是生产分支) - 一旦生产中的事情平静下来,我们就会更深入地研究事情并正确解决问题
develop
。在某些情况下,该问题也可以develop
作为其他更改的副作用来解决,例如通过合并完全删除错误代码的功能分支。无论哪种方式,关键是部署在生产中的临时黑客永远不会成功develop
这似乎是一个很小的差异,但它改变了事情:
- 在某些时候,正在发生的事情
develop
被放在发布分支上(我们称之为pre-release
) - 经过一些测试和修复后,候选版本已准备好进入生产分支,因此我们需要合并
pre-release
到master
. 我们打电话git checkout master; git merge --no-ff pre-release
,我们已经完成了......除了我们不是
让我们进入正题:
我刚才所描述的事情有些不对劲。完成后,我们所拥有master
的不仅仅是发布候选。它是候选版本加上之前的修补程序提交。由于该提交中的更改不得保留在生产中,因此这是一个问题。
所以这里的问题是:如果git checkout master; git merge --no-ff pre-release
这里错了,合并的正确方法是pre-release
什么master
?
我的意思是,即使我们不需要提交,我也可以合并hotfixes
到,用来忽略其中的内容,但这并不是解决这个问题的正确方法develop
git checkout develop; git merge -s ours hotfixes
解决方案
从大局来看,您的工作流程听起来很合理。
关于修补程序,您必须更改的一件事是您必须引入一个提交来逆转不需要的修补程序解决方案。
有两种情况:
简单的案例
分支develop
不会使修补程序变得不必要。充其量,您只需从修补程序分支并git revert HEAD^
在其之上提交,然后将此提交合并到develop
. 现在,您可以像往常一样彻底解决问题,无论是develop
在恢复的修补程序之上还是之上。
复杂的案例
分支develop
使修补程序过时。要覆盖修补程序的更改,请先将修补程序的父级合并到develop
,然后使用git merge -S ours
忽略修补程序更改。
考虑以下分支历史。将每个节点名称ABC
视为文件的内容。
ABC
/ \
| / ABCx <- hotfix (on master)
ABDC | /| <- change on develop makes hotfix obsolete
| / / |
v / | <- git merge hotfix^ into develop
ABDC | <- git merge -S ours hotfix into develop
\ /
ABDC <- git merge develop into master
[编辑:这是错误的:如您所见,最后git merge
看到“D
被添加到develop
”和“x
被添加到master
”,因此,两者的添加是合并的结果。]
以常规方式在修补程序之前合并提交很重要,否则git merge -s ours
也会忽略修补程序之前的所有未合并更改。
推荐阅读
- angular - Angular:如何根据父应用程序组件的路由更改重新渲染子组件?
- python - Django 更新个人资料照片
- apache-kafka - NiFi:从 Kafka 主题中消费而不移动偏移量
- html - 如何在不完全删除空格的情况下减少空格?
- elasticsearch - Elasticsearch 中的地理点索引数组
- android - Flutter:使用指纹解密AES?
- powershell - Powershell:如何删除早于 X 天的特定格式文件(仅限 .xlsx)
- apache-spark - 在配置了 20 个工作节点的 Spark 集群上,我的 Java 代码写入 DB2 数据库时卡在了 foreachpartition() 中
- python - Python Sql 代码错误 - sqlite3.OperationalError: SQL 变量太多
- firebase - 使用spring在服务器端使用电话号码进行Firebase身份验证