什么Git分支模型适合你?
我们公司目前正在使用简单的中继/发布/修补程序分支模型,并且希望得到关于哪些分支模型最适合您的公司或开发流程的建议。
工作流程/分支模型
以下是我所看到的这三个主要描述,但它们部分相互矛盾,或者不足以理清我们遇到的后续问题(如下所述)。 因此,我们的团队迄今默认不是很好的解决方案。 你在做更好的事情吗?
合并VS rebasing(纠结vs顺序历史)
是否应该pull --rebase
或者等到合并回主线直到你的任务完成? 我个人倾向于合并,因为这保留了在任务开始和完成的基础上的视觉插图,我甚至更喜欢merge --no-ff
来实现此目的。 但是它也有其他的缺点。 还有很多人没有意识到合并的有用特性 - 它不是可交换的(将主题分支合并为主并不意味着将主合并到主题分支中)。
我正在寻找一个自然的工作流程
有时会发生错误,因为我们的程序没有用简单的规则来捕捉特定的情况。 例如,早期版本所需的修补程序当然应该基于下游,以便可以将上游合并到所有必需的分支中(这些术语的用法是否足够清楚?)。 然而,在开发人员意识到它应该放在更下游之前,修正会让它进入主服务器,并且如果这已经被推动(甚至更糟糕,合并或基于它的东西),那么剩下的选项是樱桃采摘,其相关的风险。 你使用了哪些简单的规则? 此外还包括一个主题分支的尴尬必然排除其他主题分支(假设它们从共同基线分支)。 开发人员不想完成一项功能,开始另一项功能,就像他们刚写的代码不再存在一样
如何避免造成合并冲突(由于挑选樱桃)?
似乎确定合并冲突的方法是在分支机构间进行挑选,他们再也不能合并了? 在任何一个分支中应用相同的提交还原(如何做到这一点?)可能会解决这种情况? 这是我不敢推动大部分基于合并的工作流的原因之一。
如何分解成局部分支?
我们意识到,从主题分支组装完成的集成是非常棒的,但是我们开发人员的工作往往没有明确的定义(有时候简单到“扯开”),如果某些代码已经进入了“其他”主题,根据上面的问题,它不能再被带出去吗? 你如何处理定义/批准/毕业/发布你的主题分支?
像代码审查和毕业等适当的程序当然是可爱的。
但是我们根本无法将事情解决得足够简单来解决这个问题 - 任何建议? 整合分支机构,插图?
以下是相关问题的列表:
同时查看Plastic SCM在任务驱动开发中写的内容,如果Plastic不是您的选择,请研究nvie的分支模型和他的支持脚本。
DVCS新开发人员需要了解的最令人不安的功能是发布过程:
从这点出发,您可以遵守一些规则来简化问题:
现在:
工作流程/分支模型 :
每个工作流程都支持发布管理流程,并针对每个项目量身定制。
我所提到的工作流程中提到的是:每个开发人员不应该创建一个功能分支,而只需要一个“当前开发人员”分支,因为事实是:开发人员通常不知道他/她的分支会产生什么:一个功能,几个(因为它结束了太复杂的功能),没有(因为没有准备好及时发布),另一个功能(因为原来的一个“变形”),...
只有“集成商”才能在“中央”回购站上建立官方特色分支,然后由开发人员提取这些分支来重新合并他们适合该功能的部分工作。
合并VS rebasing(纠结vs顺序历史) :
我喜欢你提到的答案(“内部开发git使用的工作流描述”)
我正在寻找一个自然的工作流程 :
对于修补程序,它可以帮助将每个修补程序与来自错误跟踪的故障单关联起来,这有助于开发人员记住在哪里(即在哪个分支上,即“专门修理”的分支)他/她应该进行此类修改。
然后钩子可以帮助保护中央仓库免受未经验证的错误修复或从不应该推送的分支推送。 (这里没有具体的解决方案,所有这些都需要根据您的环境进行调整)
如何避免造成合并冲突(由于挑选樱桃)?
正如JakubNarębski在答复中所说的那样,樱桃采摘应该保留在需要的地方的罕见情况。
如果你的设置涉及很多樱桃采摘(即“这不是罕见的”),那么有些东西是关闭的。
在回复中应用相同的提交(如何执行此操作?)
git revert
应该照顾,但这并不理想。
如何分解成局部分支?
只要一个分支还没有被推到任何地方,开发者就应该重新组织它的提交历史(一旦他/她终于看到开发需要一个更加明确和稳定的形状):
适当的程序,如代码审查和毕业?
集成分支(在专门的集成)回购可以帮助开发者:
我认为,也许我错了,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
。 发布可能是标签或分支,修补程序本身可能是分支。 事实上,我可能会以分支形式发布,因此您可以继续修补它们。 origin
,你应该在你的资料库,可能使另一个分支与合并最新的master
进yourbranch
让别人可以用尽可能拉你的变化尽可能少的努力。 根据我的经验,很少有必要真正重新设计底板。 git add .
然后git commit
。 我希望有所帮助。 我意识到VonC刚发布了一个非常类似的解释......我输入的速度不够快!
编辑一些关于如何在商业环境中使用git的进一步想法,因为这与评论中的OP相关:
product.git
的版本库可以由一些负责真正关注产品本身的高级程序员/技术人员访问。 它们类似于维护者在OSS中的角色。 那么会发生什么? 那么,每个人从“上游”来源,即发布资源库(这也可能包含前几天开发的最新资料)开始每天都会抽出。 每个人都直接这样做。 这将在他们的存储库中的一个分支上,可能被称为“主”,或者如果你叫我“最新”。 程序员然后会做一些工作。 这项工作可能是他们不确定的事情,所以他们做一个分支,做这项工作。 如果不起作用,他们可以删除分支并返回。 如果是这样,他们将不得不合并到他们目前正在从事的主要分支中。 我们会说这是一个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