version-control - 使用"特性分支"兼容重构?

特性分支当然使得重构更加困难。 它们也使得 持续集成 和部署变得更加困难,因为你正在增加需要构建一个测试的并行开发流的数量。 你还在回避"持续集成"--的中心原则,每个人都在使用相同的代码库和"连续",将他们的更改与团队的其他变更集成。 通常情况下,当使用功能分支时,功能分支不会持续生成或者测试,因此"功能分支"代码在生产 build/test/deploy 过程中运行的第一时间是"已经完成"并合并到主干。 这可以在开发过程的后期和关键阶段引入大量的问题。

我认为有争议的观点,你应该避免特性分支 ( 近) 所有成本。 合并的成本非常高,( 更重要的可能更重要) 将失败的机会花费到一个共享代码库的机会更高。

在你的场景中,你确定每个客户机的feature(s) 需要一个单独的特性分支? 是否可以在主干中开发这些功能,但在准备好之前将它们禁用。 一般来说,我认为这是更好的发展这样"功能"--检查在树干,即使他们不是production-ready,但是让他们的应用程序,直到他们准备好了。 这个练习也鼓励你把你的组件well-factored和屏蔽在well-designed接口。 "功能分支"方法为你提供了在代码库中进行扫描以实现新特性的借口。

我喜欢这篇文章('放弃重构'),因为它丰富了讨论:

我同意,你必须非常小心大重构时,有大量的并行代码线,因为冲突会增加集成工作很多,甚至导致引入regression-bugs合并。

由于重构 vs feature-branches问题,有很多权衡。 因此,我根据案例来决定一个案例:

  • 在feature-branches我只做重构,如果他们准备更容易实现。 我总是试着把注意力集中在特性上。 分支应该至少与主干/主线不同。
  • 相反,有时我甚至有重构分支,在那里我做了更大的重构( 恢复多个步骤非常简单,我不会分散我的主干同事的注意力) 。 我当然会告诉我的团队,我做这个重构和试图计划开发周期在清理( 如果你喜欢的话,叫它 sprint ) 。
  • 如果你提到的政治是一件大事,那么我会在内部封装重构努力,并将它的添加到评估中。 在我看来,在middle-terms中的客户在拥有更好的code-quality时将看到更快的进度。 很可能,不理解重构( 这是合理的,因为这超出了他们的范围。),所以我将它的隐藏起来
  • 我从不做的是在release-branch上重构,它的目标是稳定的。 只允许bug-fixes在那里。

作为总结,我将根据代码线规划我的重构:

  • feature-branch: 只有较小的( 如果他们"帮助"我的功能"
  • refactoring-branch: 对于较大的,重构目标不是完全清晰的( 我经常叫他们"交织重构)
  • 主干/主线:好,但是我必须与feature-branches上的开发者沟通,不要创建一个集成的噩梦。
  • release-branch: 永远不会

重构和合并是两个组合主题塑料 SCM 重点关注。 事实上,有两个重要的区域需要关注: 一个是处理( 合并期间)的文件,这些文件已经被 移动或者重命名。 好消息是,所有"新时代"scm会让你这样做正确( 塑料,Git,Hg ) ( SVN,Perforce和更老的) 虽然旧的只是失败。

另一部分是在同一个 file: 中处理重构的代码。你可以移动代码,其他开发人员同时修改它。 这是一个比较困难的问题,但我们也关注于新的合并/差异工具集。 找到 xdiff信息和xmerge( cross-merging ) 。 一个好的讨论如何找到移动代码 ( 与与"比较") 之外。

当"目录合并"或者结构合并问题是一个核心的( 系统是否执行该操作) 时,第二个是一个工具问题( 你的三元合并和差异工具有多好) 。 你可以自由地使用Git和Hg来解决第一个问题( 甚至塑料供应也是免费的) 。

一个简单的重命名方法应该合并为重命名的方法,而不是编辑101行代码,

多年来,已经有很多

...