什么Git分支模型适合你?

我们公司目前正在使用简单的中继/发布/修补程序分支模型,并且希望得到关于哪些分支模型最适合您的公司或开发流程的建议。

  • 工作流程/分支模型

    以下是我所看到的这三个主要描述,但它们部分相互矛盾,或者不足以理清我们遇到的后续问题(如下所述)。 因此,我们的团队迄今默认不是很好的解决方案。 你在做更好的事情吗?

  • gitworkflows(7)手册页
  • (nvie)一个成功的Git分支模型
  • (reinh)敏捷团队的Git工作流程
  • 合并VS rebasing(纠结vs顺序历史)

    是否应该pull --rebase或者等到合并回主线直到你的任务完成? 我个人倾向于合并,因为这保留了在任务开始和完成的基础上的视觉插图,我甚至更喜欢merge --no-ff来实现此目的。 但是它也有其他的缺点。 还有很多人没有意识到合并的有用特性 - 它不是可交换的(将主题分支合并为主并不意味着将主合并到主题分支中)。

  • 我正在寻找一个自然的工作流程

    有时会发生错误,因为我们的程序没有用简单的规则来捕捉特定的情况。 例如,早期版本所需的修补程序当然应该基于下游,以便可以将上游合并到所有必需的分支中(这些术语的用法是否足够清楚?)。 然而,在开发人员意识到它应该放在更下游之前,修正会让它进入主服务器,并且如果这已经被推动(甚至更糟糕,合并或基于它的东西),那么剩下的选项是樱桃采摘,其相关的风险。 你使用了哪些简单的规则? 此外还包括一个主题分支的尴尬必然排除其他主题分支(假设它们从共同基线分支)。 开发人员不想完成一项功能,开始另一项功能,就像他们刚写的代码不再存在一样

  • 如何避免造成合并冲突(由于挑选樱桃)?

    似乎确定合并冲突的方法是在分支机构间进行挑选,他们再也不能合并了? 在任何一个分支中应用相同的提交还原(如何做到这一点?)可能会解决这种情况? 这是我不敢推动大部分基于合并的工作流的原因之一。

  • 如何分解成局部分支?

    我们意识到,从主题分支组装完成的集成是非常棒的,但是我们开发人员的工作往往没有明确的定义(有时候简单到“扯开”),如果某些代码已经进入了“其他”主题,根据上面的问题,它不能再被带出去吗? 你如何处理定义/批准/毕业/发布你的主题分支?

  • 像代码审查和毕业等适当的程序当然是可爱的。

    但是我们根本无法将事情解决得足够简单来解决这个问题 - 任何建议? 整合分支机构,插图?

  • 以下是相关问题的列表:

  • 什么是一些好的策略来允许部署的应用程序可修复?
  • Git用于内部开发的工作流程描述
  • 用于企业Linux内核开发的Git工作流程
  • 你如何维护开发代码和生产代码? (感谢这PDF!)
  • git发布管理
  • Git Cherry-pick vs合并工作流程
  • 如何挑选多个提交
  • 你如何将选择性文件与git-merge合并?
  • 如何樱桃选择一系列的提交并合并到另一个分支
  • ReinH Git工作流程
  • git工作流程进行修改你永远不会推回原点
  • 樱桃选择合并
  • 适用于组合操作系统和私有代码的Git工作流程?
  • 使用Git维护项目
  • 为什么无法将Git与修改后的父/母合并文件更改。
  • Git分支/重新设计良好实践
  • 什么时候“git pull --rebase”让我陷入困境?
  • 大型团队如何使用DVCS?
  • 同时查看Plastic SCM在任务驱动开发中写的内容,如果Plastic不是您的选择,请研究nvie的分支模型和他的支持脚本。


    DVCS新开发人员需要了解的最令人不安的功能是发布过程:

  • 你可以导入(取/拉)你需要的任何远程回购
  • 你可以发布(推送)任何你想要的(裸)回购
  • 从这点出发,您可以遵守一些规则来简化问题:

  • 只有在分支没有被推动的情况下重新分支(自上次分叉以来没有推入)
  • 只能推到裸露的回购(自Git1.7以来强制执行)
  • 遵循Linus关于重组和合并的建议
  • 现在:

    工作流程/分支模型

    每个工作流程都支持发布管理流程,并针对每个项目量身定制。
    我所提到的工作流程中提到的是:每个开发人员不应该创建一个功能分支,而只需要一个“当前开发人员”分支,因为事实是:开发人员通常不知道他/她的分支会产生什么:一个功能,几个(因为它结束了太复杂的功能),没有(因为没有准备好及时发布),另一个功能(因为原来的一个“变形”),...

    只有“集成商”才能在“中央”回购站上建立官方特色分支,然后由开发人员提取这些分支来重新合并他们适合该功能的部分工作。

    合并VS rebasing(纠结vs顺序历史)

    我喜欢你提到的答案(“内部开发git使用的工作流描述”)

    我正在寻找一个自然的工作流程

    对于修补程序,它可以帮助将每个修补程序与来自错误跟踪的故障单关联起来,这有助于开发人员记住在哪里(即在哪个分支上,即“专门修理”的分支)他/她应该进行此类修改。
    然后钩子可以帮助保护中央仓库免受未经验证的错误修复或从不应该推送的分支推送。 (这里没有具体的解决方案,所有这些都需要根据您的环境进行调整)

    如何避免造成合并冲突(由于挑选樱桃)?

    正如JakubNarębski在答复中所说的那样,樱桃采摘应该保留在需要的地方的罕见情况。
    如果你的设置涉及很多樱桃采摘(即“这不是罕见的”),那么有些东西是关闭的。

    在回复中应用相同的提交(如何执行此操作?)

    git revert应该照顾,但这并不理想。

    如何分解成局部分支?

    只要一个分支还没有被推到任何地方,开发者就应该重新组织它的提交历史(一旦他/她终于看到开发需要一个更加明确和稳定的形状):

  • 如果需要的话可以有几个分支
  • 一个分支内的一组一致的提交(请参阅修剪Git检查)
  • 适当的程序,如代码审查和毕业?

    集成分支(在专门的集成)回购可以帮助开发者:

  • 在远程集成分支之上重新开发他/她的开发(pull --rebase)
  • 在当地解决
  • 将发展推向回购
  • 检查集成商,不会导致一团糟;)

  • 我认为,也许我错了,git最容易被误解的其中一件事是它的分布式特性。 这就说明你可以工作的方式颠覆了你的想法,尽管你可以模仿SVN的行为。 这个问题几乎是任何工作流程都会做的,这很好,但也有误导性。

    如果我对内核开发有所了解(我将专注于此),每个人都有自己的用于开发内核的git存储库。 有一个版本库,linux-2.6.git,由Torvalds负责,它充当版本库。 如果他们希望开始针对“发布”分支开发功能,那么人们会从这里克隆。

    其他知识库做了一些发展。 这个想法是从linux-2.6进行克隆,根据需要多次分支出来,直到你有一个可用的“新”特性为止。 然后,当这些准备就绪时,您可以将其提供给被认为可信的人,他们会将这个分支从您的存储库中提取出来并合并到主流中。 在linux内核中,这种情况发生在几个级别(可信中尉),直到达到linux-2.6.git,此时它成为“内核”。

    现在这里是令人困惑的地方。 分支名称根本不需要在存储库之间保持一致。 因此,我可以git pull origin master:vanilla-code并从我的存储库中名为vanilla-code的分支中的origin主人获得分支。 提供我知道发生了什么,它确实无关紧要 - 它的分布意义在于,所有存储库都是对等的,而不仅仅是像SVN这样的多台计算机共享。

    所以,记住这一切:

  • 我认为这取决于每个程序员他们如何进行分支。 所有你需要的是一个管理发布等的中央资料库。树干可能是head 。 发布可能是标签或分支,修补程序本身可能是分支。 事实上,我可能会以分支形式发布,因此您可以继续修补它们。
  • 我会合并,而不是rebase。 例如,如果你把一个存储库,克隆它,分支,并做一些开发,然后从你的拉origin ,你应该在你的资料库,可能使另一个分支与合并最新的masteryourbranch让别人可以用尽可能拉你的变化尽可能少的努力。 根据我的经验,很少有必要真正重新设计底板。
  • 我认为这是理解Git工作方式以及它能做什么的一个例子。 它需要一段时间和很多良好的沟通 - 当我开始与其他开发人员一起使用git时,我才真正开始理解发生了什么,甚至现在,我也不知道有些事情。
  • 合并冲突很有用。 我知道,我知道,你希望这一切都可以工作,但事实是代码的变化,你需要将结果合并成有用的东西。 事实上,合并冲突只是更多的编程。 我从来没有找到解决办法的简单解释,所以这里是:注意合并冲突的文件,并将它们更改为它们应该是的, git add . 然后git commit
  • 但它适合。 正如我所说的,每个用户的git存储库都是他们自己可以使用的,并且分支名称不需要相同。 例如,如果您有临时存储库,则可以强制实施命名架构,但不需要为每个开发人员提供,只能在发行版本库中使用。
  • 这是合并阶段。 当你考虑代码审查/通过质量测试时,你只能合并到发布分支等。
  • 我希望有所帮助。 我意识到VonC刚发布了一个非常类似的解释......我输入的速度不够快!

    编辑一些关于如何在商业环境中使用git的进一步想法,因为这与评论中的OP相关:

  • 我们称之为product.git的版本库可以由一些负责真正关注产品本身的高级程序员/技术人员访问。 它们类似于维护者在OSS中的角色。
  • 这些程序员可能还部分领导新版本的开发,所以他们也可能自己编写代码并维护varios存储库。 他们可能会管理登台存储库以获取真正的新功能,他们也可能拥有自己的存储库。
  • 他们下面是负责开发个别位的程序员。 例如,有人可能会负责UI工作。 因此他们管理UI.git存储库。
  • 在他们的下面是实际的程序员,他们将这些功能作为他们日常工作的一部分进行开发。
  • 那么会发生什么? 那么,每个人从“上游”来源,即发布资源库(这也可能包含前几天开发的最新资料)开始每天都会抽出。 每个人都直接这样做。 这将在他们的存储库中的一个分支上,可能被称为“主”,或者如果你叫我“最新”。 程序员然后会做一些工作。 这项工作可能是他们不确定的事情,所以他们做一个分支,做这项工作。 如果不起作用,他们可以删除分支并返回。 如果是这样,他们将不得不合并到他们目前正在从事的主要分支中。 我们会说这是一个UI程序员,工作于latest-ui所以他做了git checkout latest-ui接着是git merge abc-ui-mywhizzynewfeature 。 然后他告诉他的技术主管(UI领导),嘿,我已经完成了这样的任务,从我身上拉下来。 所以用户界面的主角不会git pull user-repo lastest-ui:lastest-ui-suchafeature-abc 。 UI领导然后在该分支上查看它,并且说,实际上,这非常好,我会将它合并到ui-latest 。 然后,他可能会告诉他下面的每个人,从他ui-latest分支或他们给予他们的任何名字上ui-latest他,并且这些功能都会被开发者探索。 如果团队很高兴,UI主管可能会要求测试主管从他身上撤下并合并更改。 这会传播给每个测试它的人(变化的下游),并提交错误报告等。最后,如果该功能通过测试等,最重要的技术线索之一可能会将其合并到当前的程序工作副本中,此时所有的改变然后传播回去。 等等。

    这不是一种“传统”的工作方式,而是设计为“同行驱动”,而不是像SVN / CVS那样的“分级”。 实质上,每个人都有提交权限,但只能在本地访问。 它可以访问存储库以及将您指定为允许使用层次结构的发行版回放的存储库。


    我已经使用了一个有良好结果的模型如下:

    一个“祝福”的回购,每个人都推动和拉回,基本上是一个客户端 - 服务器拓扑。

    没有主分支,因此没有开发人员可以将任何代码推送到“主线”。

    所有发展都发生在主题分支上。 我们使用命名空间名称来轻松检测由谁负责它:jn / newFeature或jn / issue-1234

    白板上的分支机构和看板/ Scrum卡之间也有近似1对1的映射关系。

    要释放一个分支,它被推送到祝福的回购,并且看板卡被移动以准备好审查。

    然后,如果该分支被审查接受,则它是发布的候选人。

    当一组接受的分支合并在一起并用一个版本号标记时,就会发布一个版本。

    通过将新标签推向有福的回购协议,新功能有了新的基础。

    为避免合并冲突,请恳求开发者更新(合并)未发布的分支到最新的发行标签。

    链接地址: http://www.djcxy.com/p/22741.html

    上一篇: What Git branching models work for you?

    下一篇: How to save a Python interactive session?