直到最近,我的开发工作流程如下:


从产品所有者那里获取功能
建立分支(如果功能超过1天)
将其实现分支
从主分支合并到我的分支(以减少向后合并期间的冲突)
将我的分支合并回到主分支

有时合并存在问题,但是在总的来说,我喜欢它。

但是最近我看到越来越多的想法的追随者不要建立分支机构,因为这使得实践持续集成,持续交付等变得更加困难。分散的VCS背景知识,他们谈论Git,Mercurial等的伟大合并实现。

所以问题是我们现在应该使用分支吗?

评论

我很确定这是正确的平台,但是可以,我会分支。但是也许您应该考虑在某些功能集100%完成之前将其合并回master(以提供预览:P)

听起来他们需要更好的合并策略。

我一直将所有提交视为合并,即使只是从本地到远程。从分支合并是相同的,只是更大的变更集,所以我不明白这两种说法的含义。有没有人对这些技术的性能进行过任何实际的分析,还是仅仅是过早的优化?

我认为分支机构将使CI更容易...

请不要将相同的帖子逐字交叉发布到多个Stack Exchange网站。

#1 楼

除非大家都在同一个工作树中工作,否则您将使用分支,无论是否调用它们。每次开发人员签入工作树时,他都会创建一个单独的本地开发分支,并且每次签入时都会进行合并。对于大多数团队而言,问题不在于是否使用分支机构,而是多少个分支以及用于什么目的?

真正进行“连续”集成的唯一方法是让每个人都在工作同一个工作树。这样,您可以立即知道您的更改是否对其他人产生不利影响。显然,这是站不住脚的。您需要在分支中进行一定程度的隔离以完成所有任务,即使该“分支”只是您的本地工作目录。我需要的是适当地平衡集成和隔离。

根据我的经验,使用更多的分支机构可以提高集成度,因为集成完全由需要完成工作的人员完成,而其他每个人可以更轻松地根据需要隔离无关的问题。例如,我花了最后一天跟踪了我们构建中最近引入的三个与集成相关的错误,这些错误阻止了我的“实际”工作。在将这些错误报告给需要修复的人员之后,我已经做了应尽的努力,现在我是否应该等到完成它们之后再继续工作?当然不是。我创建了一个临时的本地分支,用于还原这些更改,因此我可以有一个稳定的基准来工作,同时仍从上游接收最新的更改。

如果没有能力为此目的创建新分支,那么我将只能使用以下三种方法之一:还原中央存储库中的更改,手动维护将其还原到我的工作树中的补丁,并尝试避免不小心将它们检入,或返回到引入这些错误之前的版本。第一种选择可能会破坏其他依赖性。第二个选项需要大量工作,因此大多数人会选择第三个选项,这从根本上阻止了您进行更多的集成工作,直到修复了先前发现的错误为止。但相同的原则适用于共享分支。如果我共享我的分支,那么也许其他5个人能够继续执行其主要任务,而不是执行冗余的集成工作,因此总的来说,将执行更多有用的集成工作。分支和持续集成的问题不是拥有多少分支,而是合并它们的频率。

评论


如果您在新分支中撤消了不需要的提交,那么合并到主分支时,这是否也将它们撤消了?我会从不需要的更改之前亲自开始分支,然后将我依赖的更改挑选到新分支中。

–安东尼
2014-12-27 17:06



@anthony最有可能的是,您将在合并之前清理历史记录(删除还原)。反对历史重写的人最好遵循您的方法。

– idbrii
15年8月24日在17:40

如果要进行分支和历史记录重写,为什么还要使用Git?

– Everton
16年6月13日在16:31

#2 楼


问题是我们现在应该使用分支吗?


大约半年前,我被分配去做研究以回答这个问题。这是摘要,是根据研究的经验总结(列出如下)



没有普遍同意的“最佳”分支策略适用于任何项目


大多数资源似乎都同意选择生产策略取决于特定的项目细节
旁注。基于以上所述,似乎需要对项目分支策略的任何更改进行测试,度量,并与测试的其他选项进行比较。所有将SVN和Git进行比较的人都指出,使用Git进行合并非常容易
,一个重要因素似乎是生产发布是源自主干还是分支。基本上禁止从主干中进行产品发布的团队(这似乎不是很流行的方法),禁止使用不稳定的主干策略。从分支执行产品发布的团队有更多分支选项可供选择。
流行的策略似乎是稳定的主干,不稳定的主干和开发(集成)分支


引用
>


http://msdn.microsoft.com/zh-cn/library/aa730834%28v=vs.80%29.aspx
...决定最好的分支策略是一种平衡行为。您必须权衡生产率的提高与风险的增加。验证所选策略的一种方法是考虑变化的情况。例如,如果您决定使分支机构与系统体系结构保持一致(例如,分支机构代表系统组件),并且期望进行重大的体系结构更改,则可能必须对分支机构以及与之相关的每次更改进行重组。选择不适当的分支策略可能会导致流程开销,冗长的集成和发布周期,这对整个团队来说都是令人沮丧的...



http://www.cmcrossroads.com/bradapp/acme/branching/
...经常,增量集成是成功的标志之一,而缺乏集成通常是失败的特征。当前的项目管理方法倾向于避免使用严格的瀑布模型,而采用类似螺旋的迭代/增量开发和渐进式交付模型。渐进式集成策略(如“合并早期和经常”及其变体)是一种风险管理形式,当有更多时间对其进行响应时,它会尝试在生命周期中较早地消除风险。 [Booch],[McCarthy]和[McConnell]认为集成之间节奏的规律性是项目运行状况的主要指标(例如“脉冲”或“心跳”)。


早期和频繁的整合不仅可以更快地消除风险,而且可以缩小团队规模,也可以传达队友之间的变化...



http:/ /www.codinghorror.com/blog/2007/10/software-branching-and-parallel-universes.html
...在大多数源代码控制系统中,您可以创建数百个分支,而不会出现任何性能问题;这是跟踪所有您真正需要担心的分支的精神开销。分支是一个复杂的野兽。有很多分支方法,没有人能真正告诉您您做对与错的事情。




http://www.lostechies。 com / blogs / derickbailey / archive / 2010/02/24 / branching-strategies-when-to-branch-and-merge.aspx
...分支代码时要考虑系统的许多方面...最后,目标是为编写代码的上下文提供一个沙箱。了解可用选项,何时每个选项最适合当前情况以及这些选项的成本将帮助您确定分支方式和时间...

http://www.snuffybear .com / ucm_branch.htm
注意这里给出的其他参考,作者声称“本文描述了软件工程项目中使用的三个关键分支模型”似乎没有道理。使用的术语看起来并不广泛(EFIX,Model 1,2、3等)。
http://svn.haxx.se/users/archive-2007-10/att-0101/SCMBranchingModels-talkback.pdf
参考文献提供了一个有趣的例子,说明了沟通分支策略的困难。

http://simpleprogrammer.com/2010/06/04/simple-branching-strategy-part-1-back-to -basics /
...保持简单。在我看来,直接在外线工作是最好的方法。


当我在屏幕上实际键入时,听起来几乎像是异端,但是如果您愿意的话,一会儿,我不仅会向您展示为什么我认为这对于敏捷流程至关重要,而且还将向您展示如何使其发挥作用...


...如果我必须以一个可靠的论据为基础,这就是持续整合的价值。过去,我在博客中介绍了CI的价值和最佳实践。我是CI的忠实拥护者。


...您真的必须在这里问自己一个问题:“难道这就是您进行复杂分支所产生的所有开销,合并策略所产生的实际价值不存在于更简单的策略上?” ...


...我过去有效使用并随着时间而发展的策略。我在这里简单地总结一下。



每个人都可以下车。
发布代码时分支。
当您需要为已发布的代码创建错误修复程序时,请分支该版本。
原型的分支。
...



http://simpleprogrammer.com/2010/06/07/simple-branching-strategy -part-2-implementation /
...相当详细的演练...




http://www.codelathe。 com / blog / index.php / 2009/07/02 / a-svn-branching-strategy-that-works /
...最后,请记住,没有理想的分支和合并策略。这在很大程度上取决于您独特的开发环境...

http://blog.perforce.com/blog/?cat=62
...最坏的情况是您引入了“语义合并”问题,其中自动合并的结果不正确,但编译正常并偷偷通过了测试,甚至可能存活足够长的时间才能成为客户可见的错误。 Eek!
改变。 (通常最好是在进行更改后立即合并更改,如果可行,最好由发起更改的开发人员合并)...



http://blog.perforce .com / blog /?p = 1635
注意,由于http://www.infoq.com/articles/agile-version-control#q11和http:// msdn.microsoft.com/zh-cn/library/bb668955.aspx

促销模型说明:http://www.perforce.com/perforce/papers/life.html




https://stackoverflow.com/questions/34975/branching-strategies
社区成员在使用不同分支策略的各个项目中分享不同的经验。对于“最佳”或“最坏”,没有达成共识。经典”阅读-解释了诸如Mainline Model,Codeline等之类的术语



http://www.stickyminds.com/s.asp?F=S16454_COL_2
本质上http://oreilly.com/catalog/practicalperforce/chapter/ch07.pdf




http://www.stickyminds.com/ s.asp?F = S16511_COL_2
...确定何时以及如何分支的三种常见方法:



当您“功能已完成”时,请创建发布分支,并计划解决此代码行上的最新问题。在这种情况下,发布分支实际上是“发布准备代码行”,如软件配置管理模式中所述,因为您希望仍有工作要做。
更改工作方式以避免最终集成工作,从活动开发线开始工作。
通过创建任务分支并在发布完成后将工作合并到活动开发线中,为新工作创建分支。
...分支的原理是在发布结束时隔离代码,以使其稳定。通过分支隔离通常掩盖了质量问题,最终会在产品发布之前以维护并行流的额外成本体现出来。分支很容易。相反,这是了解困难之间分支之间的变化流向的合并和认知开销,因此选择一个使分支和合并成本最小化的过程很重要...






http://nvie.com/posts/a-successful-git-branching-model/面向Git的策略。
...是HEAD源代码始终反映生产就绪状态的主要分支。


我们认为origin / develop是HEAD源代码始终反映状态的主要分支以及下一版本的最新交付开发更改。有人将其称为“集成分支”。这是构建任何夜间自动构建的地方。...


与http://www.infoq.com/articles/agile-version- control#q11和http://msdn.microsoft.com/zh-cn/library/bb668955.aspx



http://svnbook.red-bean.com /en/1.5/svn.branchmerge.html
...关于何时合适创建功能分支的项目政策差异很大。一些项目根本不使用功能分支:提交/ trunk是免费的。该系统的优点是它很简单-无需学习分支或合并的知识。缺点是中继代码通常不稳定或不可用。其他项目则极端使用分支:没有更改直接提交给主干。即使是最琐碎的更改,也会在短暂的分支上创建,仔细检查并合并到主干中。然后删除该分支。该系统可确保始终具有异常稳定且可用的中继线,但以巨大的过程开销为代价。他们通常坚持要求/ trunk始终编译并通过回归测试。仅当更改需要大量破坏稳定的提交时才需要功能分支。一个很好的经验法则是问这个问题:如果开发人员孤立地工作了几天,然后一次全部提交了大的更改(这样/ trunk就不会变得不稳定),那么更改是否太大以至于无法审查?如果对该问题的答案为“是”,则应在功能分支上进行更改。当开发人员将增量更改提交到分支时,同行可以轻松地对其进行检查。随着工作的进展。如前所述,在分支机构工作数周或数月存在很大的风险。树干的变化可能会继续涌入,以至于两条发展线的差异如此之大,以至于试图将分支合并回到树干中可能成为一场噩梦。
最好通过定期将主干更改合并到分支来避免这种情况。制定政策:每周一次,将上周的主干更改值合并到分支机构...

http://thedesignspace.net/MT2archives/000680.html
... Eclipse CVS教程的这一部分是基于Paul Glezen在Eclipse网站上的文章:与Eclipse和CVS分支,并在他的许可下使用根据EPL许可的条款。我对他的版本所做的更改主要是为了逐步扩展它,并提供更多逐步的图像和说明,并将其与我自己的初学者教程集成在一起,以使初学者和设计师可以更容易地使用它。经验丰富的开发人员可能更喜欢从Paul版本开始工作...


http://www.eclipse.org/articles/article.php?file=Article-BranchingWithEclipseAndCVS/article1.html
http://www.eclipse.org/articles/article.php?file=Article-BranchingWithEclipseAndCVS/article2.html



http:// learnsoftwareprocesses .com / 2007/12/29 / common-branching-strategies /
...以下是一些常见的分支模型:





按发布分支模式:最常见的分支策略之一是使分支与产品发布保持一致。分支机构拥有单个发行版的所有软件开发资产。有时,更新需要从一个发行版合并到另一个发行版,但是它们通常永远不会合并。

每个升级的分支:另一个非常普遍的方法是使分支与软件资产升级级别保持一致。特定的开发版本被分支到Test分支,在该分支上执行所有集成和系统测试。完成测试后,软件开发资产将分支到Production分支中,并最终进行部署。

每个任务的分支:为避免任务(或活动)重叠和生产率下降,可以将它们隔离在单独的分支上。请记住,这些是短期分支,应在任务完成后立即将其合并,否则,所需的合并工作可能会超出首先创建它们的生产率所带来的好处。
<分支每个组件:您可以使每个分支与系统架构保持一致。在此策略中,您将分支各个组件(或子系统)。然后,每个开发组件的团队都决定何时将其代码重新合并到用作集成分支的开发线中。如果系统架构适当并且各个组件具有定义明确的接口,则此策略可以很好地发挥作用。您在分支上开发组件的事实使您可以对软件开发资产进行更精细的控制。

每个技术的分支:与系统体系结构保持一致的另一种分支策略。在这种情况下,分支与技术平台保持一致。通用代码在单独的分支上进行管理。由于分支机构上管理的软件开发资产的独特性,它们可能永远不会合并...



http://msdn.microsoft.com/zh- us / library / bb668955.aspx
...有关分支和合并指南的摘要,请参阅本指南“源代码控制指南”中的分支和合并指南。
...分支时,请考虑以下内容:



不要分支,除非您的开发团队需要同时处理同一组文件。如果不确定,可以在以后标记该构建并从该构建创建分支。合并分支可能非常耗时且复杂,特别是如果它们之间有重大更改。
构造分支树,以便只需要沿着层次结构(分支树上下)进行合并,而无需跨层次结构进行合并。跨层次结构分支需要使用无基础合并,这需要更多的手动冲突解决方法。
分支层次结构基于分支父级和分支子级,这可能与磁盘上源代码的物理结构不同。规划合并时,请记住逻辑分支结构而不是磁盘上的物理结构。
不要分支得太深。因为执行每个合并和解决冲突需要时间,所以深层的分支结构可能意味着子分支中的更改可能需要很长时间才能传播到主分支。这可能会对项目进度产生负面影响,并增加修复错误的时间。
进行高层分支,并包括配置文件和源文件。
随着时间的推移发展分支结构。
合并需要一个或多个更多开发人员执行合并并解决冲突。合并的源必须经过彻底的测试,因为做出错误的合并决定可能会破坏构建的稳定性并不少见。
跨分支层次结构的合并特别困难,并且需要您手动处理许多本可以自动处理的冲突。

可以将是否创建分支的决定减少为实时合并冲突的成本是否高于分支之间合并冲突的开销成本...



http://kashfarooq.wordpress.com/2009/11/23/bazaar-branching-strategy-with-a-subversion-trunk/


http://kashfarooq.wordpress.com/2010/12/16/bazaar-branching-strategy-with-a-subversion-trunk-revised/
http://kashfarooq.wordpress.com/2009/11/ 02 / using-bazaar-feature-branches-with-a-subversion-trunk /

http://kashfarooq.wordpress.com/2009/09/08/bazaar-or-git-moving-远离颠覆/
...这些Subversion投诉中的任何一个听起来很熟悉吗?


您会被随机告知“您需要运行更新”。然后,您进行更新-需要一些时间才能完成。然后,最后,您看到不需要下载任何更改。
您被随机提示“您需要运行清理”。
您遇到了很大的合并问题。例如,您使用ReSharper重命名一个类,与此同时其他一些更新了该类。然后,您会看到可怕的树冲突错误(颤抖)。甚至更糟的是,您重命名了整个名称空间和文件夹(双颤抖)。现在您的确陷入了一个痛苦的世界。
您的合并通常会越来越手动。您经常需要使用WinMerge,因为Subversion毫无头绪。
您经常在等待Tortoise更新/检查修改/任何内容。


我有一个我的USB笔式驱动器上的subversion存储库。我遇到树冲突并合并问题,并且是唯一的用户!


主要问题是合并...




“颠覆很烂”听起来很耳熟。是时候听Joel和Linus了吗?


http://social.msdn.microsoft.com/Forums/en/tfsversioncontrol/thread/f127676c-8f05-410c-9a30-0eb43a26a9fa
讨论在不断发展的系统中发布隔离分支策略的最佳实践。
http://branchingguidance.codeplex.com/
“ Microsoft Team Foundation Server分支指南”-庞大而详细文档以及针对不同项目的建议:此处为HTML版本。证明Microsoft不相信一种适用于所有方法的分支策略。
-integration
要进行连续集成时,最佳的分支策略是什么?
...答案取决于您的团队规模和源代码管理的质量以及正确合并复杂变更集的能力...




http:// www.zeroturnaround.com/blog/continuous-integration-and-feature-branches/
,基于Hudson / Jenkins的具体经验,结合分支参考,并结合了一些有用的参考资料,从而更详细地分析了分支与连续集成的相互作用。 /> ...我的最大发现是,尽管CI经常涉及提交,推送和获取反馈(即CI集群为您提供了工作站无法在相同的时间内提供给您的反馈),但真正的纯粹CI还有一个要求-团队需要在相同的基准上工作...使用的材料




多个分支的最佳实践–发布到Jenkins列表

是否可以处理多个分支,其中一些作业应在每个分支上运行而无需重复–发布到Jenkins列表
与分支的并行开发–发布到Jenkins列表

自动配置或创建Hudson作业– stackoverflow.com

与多个分支开发的持续集成– stackoverflow.com

在持续集成中处理多个分支– stackoverflow.com
持续集成– Martin Fowler

持续集成–维基百科





http://codicesoftware.blogspot.com/2010/03/branching-strategies.html
... CVS和SVN阻止了整个分支/合并策略,因为它们完全无法做到这一点...
...简单的规则:为您要实现的每个新功能或错误修正创建一个任务分支...对于SVN / CVS用户来说听起来有些过头,但您知道任何现代的SCM都可以在一秒钟内创建分支,因此没有真正的开销。


重要说明:如果仔细看,您会发现我正在谈论使用任务分支作为富人变更列表...
http://publib.boulder.ibm.com/infocenter/cchelp/ v7r0m1 / index.jsp?topic = / com.ibm.rational.clearcase.cc_proj.doc / c_bntr_plnbrstrat.htm
...分支策略受项目开发目标的影响,并提供了控制演化的机制代码库分支策略的变化与使用Rational ClearCase版本控制的组织一样多。但是也有一些相似之处,反映出对最佳实践的普遍遵守...
http://blogs.open.collab.net/svn/2007/11/branching-strat.html
...颠覆模型(或更准确地说是通用开源模型)就是不稳定主干模型中显示的内容。
http://en.wikipedia.org/wiki/Trunk_%28software%29
在在软件开发领域,主干是指受修订控制的文件树的未命名分支(版本)。通常,主干是开发进行的项目的基础。如果开发人员专门在主干上工作,则它始终包含项目的最新尖端版本,因此也可能是最不稳定的版本。另一种方法是将分支从主干中分离出来,在该分支中执行更改,然后在分支被证明稳定且可以正常工作时将更改合并回主干。根据开发模式和提交策略,主干可能包含最稳定或最不稳定的版本或介于两者之间的版本。


通常主要的开发人员工作都在主干和稳定版本中进行。分支,偶尔的错误修复从分支合并到主干。当在非主干分支中完成将来版本的开发时,通常是针对不经常更改的项目完成的,或者是预期更改需要很长时间才能开发的项目,直到准备好将其合并到主干中。 。
http://www.mcqueeney.com/roller/page/tom/20060919
...这些是CollabNet于2006年8月30日举办的有关Subversion最佳实践的网络研讨会的记录。 。两种组织策略:不稳定的主干vs.稳定的主干...
...在可能的情况下优先选择不稳定的主干...

https://stackoverflow.com/questions/153812/ subversion是最主要的主要开发场所
在SVN中,trunk是主要开发的推荐场所,我在所有项目中都使用了这个约定。但是,这意味着主干有时不稳定,甚至坏了...
...最好不要在/ branch / dev之类的分支上进行“野生开发”,并且仅在出现以下情况时合并到主干建造合理吗?



...主干是应该进行持续开发的地方。如果每个人都在提交更改之前测试他们的更改,那么您实际上应该对“中断”的代码没有问题。一个好的经验法则是在对更改进行编码后进行更新(从存储库中获取所有最新代码)。然后构建并进行一些单元测试。如果一切正常,您应该检查一下...
...行李箱不是最好的地方。在我们的组织中,我们始终遵循这种方法:Trunk包含发行代码,因此它总是可以编译。有了新的每个发行版/里程碑,我们将打开一个新分支。每当开发人员拥有一个项目时,他/她都会为该发行分支创建一个新分支,并且仅在对其进行测试之后将其合并到发行分支中。在系统测试之后,版本分支合并到了主干中。

http://blog.yclian.com/2009/03/working-on-branches-and-stable-trunk。 html
...我以前在主干上工作,因为对于我从事的所有项目,要么我是唯一的开发人员,要么团队要确保每个代码签入都通过本地测试。否则,我们(仍然)会创建分支来修复错误,为新功能提供大代码等。


大约2个月前,我与Kamal进行了简短的git会话,他与我分享了故事/分支的想法。随着我的团队开始与更多开发人员一起成长,我感到有必要鼓励更多的分支机构,现在这已成为规则。对于使用CI设置定义了自动化测试的项目,可以保证稳定的主干,并且这种做法非常适合。


我们不使用git而是Subversion,因为这就是我们开始了,现在(大多数时间)我们仍然对此感到满意...
http://www.ericsink.com/scm/scm_branches.html

这是一本名为Source Control HOWTO的在线书籍,这是有关源代码控制,版本控制和配置管理的最佳做法指南...


... Eric的首选分支机构实践...保持“基本上不稳定”的树干。在主干中进行积极的开发,随着发布的临近​​,主干的稳定性会提高。发货后,创建一个维护分支,并使其始终保持稳定...


...在下一章中,我将深入探讨合并分支的主题...

http://marc.info/?l=forrest-dev&m=112504297928196&w=2
开始讨论Apache Forrest项目分支策略的线程邮件


注意目前该项目似乎使用带有发行分支的不稳定主干模型: (项目准则)
“正在构建候选发布程序包... 17.在SVN中创建维护分支...”(如何发布)



O'Reilly CVS分支文档:http://commons.oreilly.com/wiki/index.php/Essential_CVS/Using_CVS/Tagging_and_Branching#Basically_stable



...基本稳定的分支哲学指出,主干应包含始终准备好发布的项目数据...
...更多这种哲学的宽大变化允许通过开发人员单元测试的所有内容都合并到主干中。这种宽松的方法要求分支发布候选者,并在发布之前进行完整的QA分析...
...基本上不稳定的哲学认为,主干应包含最新代码,而不论其稳定性如何,


...更多宽大的变体也允许分支用于实验代码,重构和其他特殊情况的代码。将分支合并回主干是由分支的管理者完成的。 ...


注意上面的资源没有出现在我执行的任何搜索中(与CVS相关的准则不再流行了吗?)




SCM最佳实践(perforce文章),网址为http://www.perforce.com/perforce/papers/bestpractices.html
... SCM部署的六个一般领域,以及一些这些领域中每个领域的最佳实践。以下各章介绍了每个项目...工作区,代码行,分支,更改传播,构建,过程...


评论


我相信这是我在任何stackexchange问​​题中看到的最长答案!

–约翰·费舍尔
2011-09-14 17:45



@JohnFisher很好,根据JIRA,那时我花了6个小时来整理和总结这些参考文献:)

– gna
2011-09-15 6:34

您缺少某种摘要,该摘要应告诉您是否对新功能使用新分支。您的答案只是各种文章的链接的总和-有些文章讲的是一回事,而其他文章讲的则相反。您的答案很长,所以我可能迷路了。

–BЈовић
2014年1月8日在9:46

答案的开头提供了@BЈовић的摘要:'没有公认的适用于任何项目的“最佳”分支策略。 *大多数资源似乎都同意选择生产策略取决于特定的项目细节

– gna
2014年1月8日12:20



补充阅读:谷歌与Facebook的基于主干的开发“他们[谷歌和Facebook]没有合并的痛苦,因为通常开发人员不与分支机构进行合并。至少在中央仓库的服务器之间,它们不是合并的。 ,开发人员可能会与本​​地分支机构进行合并,并在将“完成”的事情推送回中央仓库时重新定级……”

– gna
2014年1月14日10:22



#3 楼

如果您有多个团队同时处理不同的功能,则无法忽略分支。您应该与团队成员共享(部分实现)代码,以防止其他团队获得未完成的功能。

分支是实现此目标的最简单方法。缩短分支生命周期并避免同时在两个分支中使用同一模块非常好-这样您就不会有冲突\合并问题。

#4 楼


但是最近我看到越来越多的想法不再建立分支机构,因为这使得实践连续集成,连续交付等变得更加困难。

如果没有,我觉得没有理由改变您的工作方式。

当然,这很好遵循所发生的事情以及当前最佳实践的发展方式进行练习。但是我不认为我们需要放弃我们的流程/工具/不只是因为X(和/或Y和/或Z)表示它们不再流行:-)

评论


当然可以!这是优先级的问题:分支(功能隔离)与易于集成,交付等。

–西伯利亚人
2011-09-13 13:29



这只是您使用的CI工具的问题。是什么阻止您进行构建并从分支“连续交付”的?

–Shaddix
2011年9月13日下午13:34

@Shaddix,通常很难从分支交付。例如,如何从功能分支交付?

–西伯利亚人
2011-09-13 14:04

如果整个源代码都分支了(例如DVCS中的问题),那是什么问题?

–Shaddix
2011年9月13日下午14:12

@Shaddix,分支的代码越多,合并期间遇到的冲突就越多

–西伯利亚人
2011年9月13日下午14:19

#5 楼

一组有趣的答案。在过去20多年的时间里,我从未在一家公司中使用过很多琐碎的分支(通常只是分支发布)而工作。

我工作过的大多数地方都依赖相当快的签入和快速检测/解决冲突的能力-敏捷方法论教导,如果在双方都在积极思考的情况下注意到问题,您可以更快地解决问题关于那段代码。

另一方面,我没用过git,也许是因为git标记的加入影响了这些答案-我知道分支/合并是给定的使用git是因为它非常容易。

评论


+1,这些git'er dunns对git相对于其他版本控制/ CI设置的可争议的优势变得越来越狂热。

– Maple_shaft♦
2011年9月13日在23:03

#6 楼

是的,您应该使用分支来隔离(至少中等)开发工作。请参阅“什么时候分支?”。

问题更多是使用快进合并(在另一个分支中包含分支历史记录),前提是您首先挤压了所​​有“中间检查点提交”(在回滚或git bisect的情况下可能会出现问题。 -forward merges),前提是您要在合并的分支内进行必要的清理。
另请参见“为什么git默认情况下使用git进行快速转发?”。

#7 楼

您绝对应该使用分支。有许多优点。


如果您担心由于高清故障,笔记本电脑丢失等原因而导致工作松懈,并且不会破坏主配置项,则可以边走边检查。
/>您仍然可以执行CI,只需设置自己的本地CI来监视分支。
如果功能突然被搁置(从未发生过,则可以停放)。

太辛苦绝不是借口。始终需要付出更多的努力才能做到正确。

评论


我想对此表示反对,不是因为我反对分支,而是因为您建议应始终使用它们。

– Maple_shaft♦
2011年9月13日下午13:31

他在哪说的,是他编辑的还是什么?

–b01
2011-09-13 13:42

设置您自己的本地CI,以监视您的分支机构是否存在短暂的分支机构(2-5天),这可能会造成很大的开销。去过也做过

– gna
2011年9月13日下午13:57

我在回答一般使用分支或根本不使用分支的问题。与任何规则或政策一样,良好的判断也应发挥作用。我没有在很多项目上进行协作,但是我主要还是在提到的第三个项目符号上主要自由使用分支。同样关于第一个项目符号,您已经紧急请求多少次才能发布某些功能/修订,但接着您进入,您掌握了大约3个半成品。

– Bill Leeper
2011年9月13日下午16:36

那不是在做CI。我在CI中代表集成-集成所有开发人员的工作,即合并。在本地为每个提交运行测试没什么错,但是那是相同的。

–bdsl
17-2-17在23:28



#8 楼

如果两个团队在各自的分支机构工作,即使两个团队都集成了master分支,他们也​​看不到另一个团队的更改。这意味着他们的开发分支将错位,如果其中一个团队与master合并,另一个团队必须重新调整很多变更。

所以,即使您有功能分支,我也敦促您可以将所有重构“反向移植”到master分支,并仅保留该分支用于新功能。


Backport重构

我认为有时使用功能开关来禁用尚未投入生产的未经测试的新功能可能会更容易。这样,所有其他团队都将看到更改,而不必进行大的合并。


使用功能开关


#9 楼

我们再次经历了这个问题。
首先,我们进行了整个GIT / SVN辩论,这使我们总体上制定了分支战略。

较大的公司都使用基于主干的策略,每个人都在同一个分支中工作,并从该分支进行构建和持续集成。
通过代码模块化,功能切换和巧妙的工具来避免冲突。
这听起来很困难。因为这是。
但是,如果您要进行这场辩论,那是因为您已经成为人们对分支的幻想的受害者。有人声称他们在这里使用具有完全符合sarbanes-oxley标准的促销分支机制的insert SCM工具,这一切都很出色。它们要么在撒谎,在自欺欺人,要么无法在与您相同的系统规模上工作。

分支和合并非常困难。特别是如果您的业务定期改变主意,并要求回滚等。

这句话可能会挽救您的生命:
SCM中的内容与SCM中的内容不同您构建的工件!

如果您在分支方面遇到麻烦,那是因为您滥用了SCM。我们已经做了很多年了。
您已经有了一个使用SCM来确定最终构建内容的系统。

单片机。 SCM是美化的文件服务器。
确定SCM中的哪些文件进入构建的工作属于您的构建工具。

模块A正在开发中,并进入每周一次
模块B是模块A,但其中包含项目X,并且正在同一分支中进行开发,但尚未构建到您的发行版中。
在将来的某个时候,您要发布项目X。
因此,您告诉构建工具停止放入模块A,然后开始放入模块B。

关于这一点,将会有很多的哭泣和扭动。什么风风雨雨,一般general叫。这就是围绕诸如文件存储库之类的东西的情绪水平,无论多么聪明。

但是有您的答案。

#10 楼

分支的主要问题是开发完成后很难合并回主分支。合并可能是一个手动操作且容易出错的过程,因此在大多数情况下都应避免。

我更喜欢分支的一些显着例外是大规模重构,这些巨大的功能需要比sprint更长的开发时间,或破坏性特征,这些特征会在大多数sprint期间中断其他特征的开发。

评论


听起来您需要更好的实践来开发新功能。我个人喜欢将项目构建为易于隔离功能,通常在单独的文件/类/或其他文件中。这样,添加或删除代码不会在合并新代码或拉出旧代码时造成任何重大的交付中断或问题。与多个开发人员一起开发时,这也很好。但是我可以理解,如果您正在从事的项目可能不是您自己启动的,或者您没有真正的发言权-关于项目的继续方式。

–b01
2011-09-13 13:50



@ b01,多数民众赞成在很多地方。当需求来回变化时,没有人会想到完美的设计。其他时候,您最终试图重构遗留代码以改善设计,并且这种情况有时会出现。这不是一个团队可以遇到的最严重的问题,并且比我在某些工作场所做的要好得多,在这些工作场所甚至建议在会议中进行重构将使您被棒球棍打死,例如《不可触摸》中的场景。

– Maple_shaft♦
2011年9月13日下午14:14

完全不同意。如果按质量分支划分,并频繁合并(每天都很好),则可以避免几乎所有“手动且容易出错”的合并。

– Paul Nathan
2011-09-13 15:58

@Paul,请相信我,这不适用于所有项目或技术。想想一个常见的XML配置文件,例如在Struts中,每个人每天都将其投入其中。但是,不,您的方法一直都有效,我完全应得票数。谢谢。

– Maple_shaft♦
2011年9月13日在17:07

@maple_shaft元提示,如果您考虑了标签(git)并发布了这些标签的典型用户会认为是负面的内容,请期待flyby downvotes。对于您个人提出的评论,Flybys几乎总是不公正的反应。认为这很好,因为它可以提高您的销售代表的效率。

– Bill K
2011-09-13 20:26



#11 楼

我建议使用这种分支方案:

发布-测试-开发

然后从开发,按开发人员和/或按功能进行分支。

每个开发人员都有一个分支,可以按常规进行操作,并从中合并,然后合并到开发分支中-理想情况下每天(只要它可以编译)。

这种方案非常适合在同一代码库上的许多开发人员和多个项目。

#12 楼

我们确实使用分支,但没有在功能的粒度级别上使用。我们为每个冲刺使用分支。从本质上讲,分支并不是IMO的坏事,因为它在功能或sprint层中模拟SOC的概念。您可以轻松识别并管理哪个分支属于哪个功能或sprint。

恕我直言,然后答案是“是”。我们仍然应该使用分支。

#13 楼

我组织中的流程广泛使用分支机构和(看起来有点类似的流程)持续集成。

从高层次看,开发人员不必太担心与主线合并,他们只是提交分支。 (半)自动化过程检查计划将哪些功能纳入主线,合并这些分支并构建产品。该过程之所以有效,是因为我们实际上是从问题跟踪器集成了此合并过程,因此构建工具知道要合并的分支。

评论


如果开发人员在一个分支上重构了一些先前存在的代码,而在另一个分支上的开发人员编写了一些依赖于旧版本代码的代码,则此过程听起来会中断。

–bdsl
17年2月17日在23:31

@bdsl:只要您在同一代码库中有多个开发人员,任何分支策略(包括不分支)都可能出现此问题。在那个组织中(我已经搬进去了),我们的团队很小,我们所有人都很好地了解了我们其余的人,所以我们会在某些变化很可能发生时互相警告。发生冲突。无论如何,持续的集成帮助在引入冲突的几分钟或几小时内就极大地解决了这类问题。

–SingleNegationElimination
17年2月17日在23:39

是的,但是如果重构在完成的同一天合并到主线中,而不是等到新功能准备就绪,就不太可能了。

–bdsl
17年2月18日在16:17

@bdsl并不总是一个选择;您可能一直都需要一个“正常运行的分支”,例如,以发布紧急错误修复程序。但是,将主线定期合并到功能中的另一种方法通常是A-OK,无论您采用何种分支策略,我都强烈建议。

–SingleNegationElimination
17年2月18日在21:34