合并代码感觉舒服吗?

时间:2009-09-11 13:00:04

标签: version-control branch merge

今天早上,我读了两篇关于重构的意见。

  • 意见1(页面不存在)
  • 意见2(页面不存在)

他们建议将代码分支(并随后合并)到:

  1. 保持行李箱清洁。
  2. 允许开发人员摆脱风险的变化。
  3. 根据我的经验(特别是与Borland的StarTeam合作),合并是一项非繁琐的操作。因此,我只在我必须时(即当我想冻结候选版本时)进行分支。

    从理论上讲,分支是有道理的,但合并的机制使其成为一种非常危险的操作。

    我的问题:

      
        
    • 你觉得合并代码感觉舒服吗?
    •   
    • 您是否因为冻结版本以外的原因而对代码进行分支   候选?
    •   

18 个答案:

答案 0 :(得分:19)

分支可能会很痛苦但不应该是。

这就是git-like项目(mercurial,bazar)告诉我们关于CVS和SVN的内容。在git和mercurial上,分支很容易。在SVN上它很容易,但是对于大型项目来说,管理起来可能有点硬(因为花在分支/合并过程上的时间可能很长 - 与git和mercurial之类的其他项目相比 - 如果有非 - 显而易见的冲突)。这不能帮助那些不习惯经常分支的用户对分支有信心。很多用户都没有意识到分支的强大用途,只是把它留在不给项目添加新问题的地方,让对未知的恐惧使他们远离效率。

分支应该是一个简单而强大的工具,我们必须以任何足够好的分支来使用它。

分支的一些好理由:

  • 与其他人并行处理特定功能(或者,如果您单独参与项目,则可选择处理其他功能);
  • 拥有该应用程序的多个品牌版本;
  • 拥有相同应用程序的并行版本 - 例如同时由部分团队开发的并发技术,以确定哪些工作更好;
  • 将应用程序的资源更改为艺术家/设计人员(例如游戏中)应用程序“稳定”的特定分支,而其他分支和主干用于添加和调试功能;
  • [在这里添加有用的用法]

答案 1 :(得分:17)

一些宽松的指导原则:

  • 分支较晚,仅在您需要时
  • 早期和经常合并
  • 让合适的人进行合并,无论是进行更改的人还是撰写原始版本的人都是最好的

分支只是另一种工具,如果你想获得最大的收益,你需要学习如何有效地使用它。

您对分支的态度应该在分布式开源项目(例如Git上的项目)和您公司的开发项目(可能在SVN上运行)之间有所不同。对于分布式项目,您需要鼓励分支以最大化创新和实验,对于后一种类型,您需要更严格的控制并规定每个代码行的签入策略,这些代码行决定何时应该/不应该发生分支,主要是为了“保护”代码。

以下是分支指南:
http://www.vance.com/steve/perforce/Branching_Strategies.html

这是一个较短的指南,包含一些高级别的最佳实践:
https://www.perforce.com/sites/default/files/pdf/high-level-perforce-best-practices.pdf

答案 2 :(得分:10)

分支是微不足道的。合并不是。出于这个原因,我们很少分支任何东西。

答案 3 :(得分:10)

使用SVN,我发现分支相对无痛。特别是如果您定期将主干合并到您的分支中,以防止它变得太过不同步。

答案 4 :(得分:8)

我们使用svn。分支代码只需要5分钟左右。与挽救我们的麻烦相比,这是微不足道的。

答案 5 :(得分:4)

在数百万行代码的代码库中工作,每天都有数百名开发人员进行分支。分支的寿命取决于所完成的工作量。

对于一个小修复:

  • 设计师从主流中脱颖而出
  • 进行更改
  • 测试
  • 评论
  • 将累积的更改从主流合并到sidebranch
  • 遍历前面一个或多个步骤
  • 合并回主流

对于多人团队功能:

  • 团队在主流中创建了一个功能侧分支
  • 个人团队成员在“小修复”方法中运行功能侧分支并合并到功能侧分支。
  • sidebranch prime会定期合并从主流到功能侧分支的累积更改。从主流到功能侧支的小增量合并更容易处理。
  • 当功能有效时,从主流到功能侧分支进行最终合并
  • 将功能sidebranch合并到主流

对于客户软件版本:

  • 制作发布分支
  • 根据需要提供修复以发布分支
  • 根据需要将修复传播到主流中/从主流传播

支持客户发布流可能非常昂贵。需要测试资源 - 人员和设备。一两年后,随着主流的推进,开发人员对特定流的了解开始变得陈旧。

你能想象微软同时支持XP,Vista和Windows 7的成本是多少吗?考虑测试平台,管理,文档,客户服务,最后是开发人员团队。

黄金法则:从不打破主流,因为您可以阻止大量开发人员。的 $$$

答案 6 :(得分:2)

分支问题是我使用分布式版本控制系统(在我的情况下是Git,但也有Mercurial和Bazaar)的原因,创建分支很简单。

我一直使用短期分支进行开发。这让我在我自己的存储库中乱搞,犯错误和错误的选择,然后rebase对主分支的更改,所以只有干净的更改保留在历史记录中。

我使用tag来标记冻结的代码,并且在这些系统中很容易返回并分支掉这些以修复错误,而不需要在代码库中加载长期存在的分支。

答案 7 :(得分:1)

我使用Subversion并考虑分支非常简单和容易。所以回答问题1 ..是的。

分支的原因可能有很大差异。如果我觉得我应该分支。很难为所有可能性制定规则和理由。

然而,就“允许开发人员摆脱风险变化”而言。评论。我完全同意那个。每当我想要真正使用代码时,我就创建了一个分支,并希望我是唯一一个开发它的开发人员。当你分支时,你可以做到这一点......

答案 8 :(得分:1)

如果合并太麻烦,请考虑迁移到更好的VCS。这将是一个更大的痛苦,但只有一次。

答案 9 :(得分:1)

我一直在使用svn和TFS进行项目,并且单独进行分支是一件非常简单的事情。

我们使用分支发布候选版本以及持久或实验性功能以及隔离其他团队的干扰。

分支中唯一痛苦的时刻是合并,因为旧的或强烈发展的分支可能与主干有很大不同,可能需要付出巨大努力才能合并。

如上所述,我会说分支是一种强大而有用的做法,在开发过程中应予以考虑。

答案 10 :(得分:0)

分支和合并应该相当简单。

  • 我觉得分支/合并非常舒服。
  • 根据您的开发流程模型/
  • ,分支完成的原因各不相同

有一些不同的分支模型:

这是一个

  Trunk          
  .      
  .      
  .      
  ..         
  . ....     
  .   ...
  .      ..Release1
  .      
  .      
  ...        
  .  .... 
  .    ...Release2
  .      
  .      
  ..         
  . ...  
  .  .. 
  .    ...Release3
  .      
  .      

现在这是一个奇怪的事情。假设Release1需要一些错误修正。现在你需要分支Release1来开发1.1。没关系,因为现在你可以分支R1,做你的工作,然后合并回R1以形成R1.1。注意这是如何在版本之间保持差异的?

另一个分支模型是在Trunk上完成所有开发,并且每个版本都会被标记,但不会在该特定版本上进行进一步的开发。分支机构正在发展中。

  Trunk                                           
  .                                                         
  .                                                         
  .                                                         
  .Release1           
  .                       
  .                       
  .                   
  .                   
  .Release2           
  .                   
  .......                 
  .      ......       
  .           ...DevVer1
  .          .    
  .          .            
  .        ...DevVer2
  .      ....         
  .  ....             
  ...                     
  .Release3           
      .

可能有一两个其他主要分支模型,我无法回想起它们。

最重要的是,您的VCS需要支持灵活的分支和合并。 每个文件的VCS系统呈现出一个主要的痛苦IMO(RCS,Clearcase,CVS)。 据说SVN在这里也很麻烦,不知道为什么。

Mercurial在这里做得很好,(我认为)git。

答案 11 :(得分:0)

分支是微不足道的,因为大多数人已经回答了,但正如你所说的那样合并不是。

真正的关键是解耦和单元测试。尝试在分支之前解耦,并密切关注main以确保解耦和接口得到维护。这就是合并的时候,就像更换乐高乐器一样:取下旧乐器,新乐器完全适合它的位置。单元测试用于确保没有任何损坏。

答案 12 :(得分:0)

我们使用StarTeam,只有当我们遇到需要它的情况时才会分支(即在发布周期中修改生产或者跨越多个发布窗口的一个长达项目)。我们使用View Labels来识别版本,这使得稍后根据需要创建分支变得简单。所有构建都基于这些视图标签,我们不构建未标记的代码。

开发人员应该遵循“代码 - 测试 - 提交”模型,如果他们需要某个测试目的或“风险”开发的视图,他们就会创建并管理它。我管理存储库并仅在需要时创建分支。那些时间是(但不限于):

  • 制作修补程序
  • 具有长期或重叠开发周期的项目
  • 广泛的重写或实验开发

StarTeam中的合并工具并不是最好的,但我还没有遇到由它引起的问题。无论谁做合并,都需要非常确定他们知道自己在做什么。

在Star Team中创建“只读参考”视图并将其设置为浮动配置将允许中继中的更改自动显示在分支中。在更改时将项目设置为分支。这对于并发开发工作很有用。

创建带有标签配置的“只读参考”视图是您用于现有生产版本的热修复(假设您已标记它们)。

答案 13 :(得分:0)

  

您觉得分支代码很舒服吗?

这实际上取决于我正在使用的工具。使用Starteam,分支确实非常简单(TBH,Starteam在分支时很糟糕)。使用Git,分支是一项常规活动,非常简单。

  

您是否因为冻结候选版本以外的原因而对代码进行分支?

嗯,这实际上取决于您的版本控制模式,但简短的答案是肯定的。实际上,我建议阅读以下文章:

我非常喜欢第一篇文章中描述的模式,它可以应用于任何(非分布式)版本控制系统,包括Starteam。

我可能会考虑第二种方法(实际上是两种策略的混合)与(仅限于)Git,Mercurial等分布式版本控制系统(DVCS)......

答案 14 :(得分:0)

分支必须正确管理才能使合并无痛。根据我的经验(使用Perforce),从主线定期集成到分支机构意味着回到主线的集成非常顺利。

合并失败的情况很少见。从主线到分支的持续集成可能涉及合并,但它们只是自动工具无需人为干预即可处理的小编辑。这意味着用户没有“看到”这些情况。

因此,最终集成中所需的任何合并通常也可以自动处理。

在实际需要时,Perforces 3向合并工具非常有用。

答案 15 :(得分:0)

我只做了几次,所以我对它不太满意。

我已经完成了设计实验,这些实验将跨越一些签到,所以分支是一种简单的方法,可以让你自己进入花园。此外,它允许我修补,而其他人在主要分支上工作,所以我们没有浪费太多时间。

我在进行大范围更改时也会这样做,这会使主干无法编译。在我的项目中很明显,我必须删除大部分代码库的编译时类型安全性(从泛型到system.object)。我知道这需要一段时间,并且需要在整个代码库中进行更改,这会干扰其他人的工作。在我完成之前,它也会破坏构建。因此,我分支并删除了泛型,直到该分支编译为止。然后我将它合并回主干。

结果非常好。防止了很多脚趾踩踏,这很棒。希望这样的事情不会再出现了。它是一种罕见的东西,设计将改变,需要这种广泛的编辑,不会导致大量的代码被抛出......

答案 16 :(得分:0)

我使用svn,分支代码只需不到一分钟。我以前使用Clearcase,分支代码花了不到一分钟。我还使用了其他较小的SCM,它们要么不支持分支,要么使用起来太痛苦。 Starteam听起来像后者。

所以,如果你不能迁移到更有用的(实际上,我只听到关于Starteam的坏事),那么你可能不得不尝试不同的方法:手动分支。这包括检出代码,将其复制到另一个目录,然后将其添加为新目录。当您需要合并时,您将检出两个目录并使用WinMerge执行合并,将结果签入原始目录。如果你继续使用分支,那就很尴尬并且可能很难,但它确实有用。

分支的技巧不是将其视为一种全新的产品。它是一个分支 - 一种相对短暂的设备,用于单独和安全地更改主产品主干。任何认为合并困难的人要么重构代码文件(即重命名,复制,创建新的,删除旧代码),分支变成一个完全不同的东西,或者他们保持分支这么长,累积的变化承担与原版很少相似。 您可以长时间保留分支机构,您只需要定期合并您的更改。这样做,分支/合并变得非常容易。

答案 17 :(得分:0)

我们使用svn并采用了一个规则来分支破坏变化。在行李箱中进行微小的更改。

我们也发布分支。

分支和合并对我们来说效果很好。当然,有时我们必须坐下来思考事情如何融合在一起,但通常svn在合并所有事情方面做得很好。