Git 将事物合并到生产/发布分支中的正确方法是什么?
我和我的团队目前正在进行一个小项目 为了正确地进行操作,我们尝试遵循一种类似于中所述的git分支模型: 不过,与图中所示的一个关键区别在于Git 将事物合并到生产/发布分支中的正确方法是什么?,git,Git,我和我的团队目前正在进行一个小项目 为了正确地进行操作,我们尝试遵循一种类似于中所述的git分支模型: 不过,与图中所示的一个关键区别在于修补程序分支: 当一个bug在生产中出现时,我们必须尽快修复它的行为,我们通常必须通过一个临时的解决方案(不应该保持硬编码的硬编码的东西,等等)来做到这一点。此解决方案在修补程序上开发,然后合并到主程序(生产分支) 一旦生产中的情况稳定下来,我们将更深入地研究问题,并在develope上正确地解决问题。在某些情况下,该问题也可能作为其他更改的副作用在dev
修补程序
分支:
- 当一个bug在生产中出现时,我们必须尽快修复它的行为,我们通常必须通过一个临时的解决方案(不应该保持硬编码的硬编码的东西,等等)来做到这一点。此解决方案在
上开发,然后合并到修补程序
(生产分支)主程序
- 一旦生产中的情况稳定下来,我们将更深入地研究问题,并在
上正确地解决问题。在某些情况下,该问题也可能作为其他更改的副作用在develope
上得到解决,例如通过合并一个功能分支来完全删除故障代码。不管是哪种方式,关键是在生产中部署的临时黑客永远无法进行develope
develope
- 在某种程度上,在
上的内容被放在发布分支上(我们称之为develope
)pre-release
- 经过一些测试和修复后,候选发行版已准备好进入生产分支,因此我们需要将
合并到预发行版
。我们称之为主版
,我们完成了。。。但我们不是git签出主机;git merge--没有ff预发行版
master
上的内容不仅仅是发布候选版本。它是候选版本加上以前的热修复提交。由于提交中的更改不能保留在生产中,因此这是一个问题
所以这里有一个问题:如果git checkout master;git merge——这里没有ff预发布
是错误的,将预发布
合并到主版
中的正确方法是什么
我的意思是,我可以使用git checkout develope将
hotfix
合并到develope
中,即使我们不需要提交;git merge-s我们的修补程序忽略了其中的内容,但这并不是解决这个问题的正确方法你的工作流程听起来很合理
关于热修复程序,您必须改变的一件事是,您必须引入一个提交来反转不需要的热修复程序解决方案
有两种情况:
简单的情况
分支develope
不会使修补程序变得不必要。充其量,您只需从修补程序分支并在其上提交git revert HEAD^
,然后将此提交合并到develope
。现在,您可以像往常一样在develope
或恢复的热修复程序上彻底修复问题
复杂的案件
分支develope
使修补程序过时。要覆盖修补程序的更改,首先将修补程序的父级合并到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
ABC
/ \
|/ABCx您能否澄清为什么不想将修补程序
合并到开发
中,然后正常解决更改?分支模型有这样的原因,它可以解决您的问题。分支模型做到了这一点(IMO),因为并非所有的修补程序都是“临时解决方案”。有时候,热修复是永久性的解决方案——一个简单的例子是“面向用户的消息中的业务关键型键入错误”——在大约10秒钟内修复,并且它将保持不变。图表保留了一个重要属性:开发负责人总是当前的生产版本加上一些东西。根据及物性,候选发布版本也是当前的生产版本加上一些东西。在每种情况下,如果“某些东西”的一部分都恢复了热修复程序,这没什么关系。@Vlad274不是说没有热修复程序会进入develope
,而是有些不会(因为它们是临时的,因为它们被develope
上的其他更改所淘汰)。问题是在这些情况下该怎么办cases@chepner从理论上讲,你所说的保留一个属性听起来不错,但1)必须将修补程序合并到develope
中,然后立即恢复,我觉得不对;2)让我的同事每次都这么做,即使对develope
没有影响,似乎很难,3)如果热修复程序修改的文件或函数在develope
上不再存在,该怎么办?甚至没有一个合适的方法将热修复提交到该分支…“立即恢复”,这听起来像是你仍然想继续开发bug,直到它被正确修复。尽管修复是临时的,甚至可能被认为是一种黑客行为,但它的实现已经足够好,可以保证投入生产(不是吗?),因此它也应该足够好,可以用于开发,即使立即修复可能最终淘汰/恢复/删除所有这些。你能解释一下不融入开发的原因吗?为什么您不希望修复也出现在那里?因此,如果我理解正确,在案例1中。你是说我可以直接在热修复程序上恢复临时更改,在那里开发适当的修复程序,然后将其合并到开发程序中。这似乎很合理。你能对案例2作更多的解释吗。?为什么不能在develope
上使用git merge-S ours
将热修复提交为祖先而不进行更改?如果在那之后我们将development
合并到master
中,那么master会发生什么呢?我已经编辑了