Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 将事物合并到生产/发布分支中的正确方法是什么?_Git - Fatal编程技术网

Git 将事物合并到生产/发布分支中的正确方法是什么?

Git 将事物合并到生产/发布分支中的正确方法是什么?,git,Git,我和我的团队目前正在进行一个小项目 为了正确地进行操作,我们尝试遵循一种类似于中所述的git分支模型: 不过,与图中所示的一个关键区别在于修补程序分支: 当一个bug在生产中出现时,我们必须尽快修复它的行为,我们通常必须通过一个临时的解决方案(不应该保持硬编码的硬编码的东西,等等)来做到这一点。此解决方案在修补程序上开发,然后合并到主程序(生产分支) 一旦生产中的情况稳定下来,我们将更深入地研究问题,并在develope上正确地解决问题。在某些情况下,该问题也可能作为其他更改的副作用在dev

我和我的团队目前正在进行一个小项目

为了正确地进行操作,我们尝试遵循一种类似于中所述的git分支模型:

不过,与图中所示的一个关键区别在于
修补程序
分支:

  • 当一个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会发生什么呢?我已经编辑了