【问题标题】:Is there a 3 way merger tool that “understands” common refactoring?是否有“理解”常见重构的 3 路合并工具?
【发布时间】:2011-01-15 04:40:42
【问题描述】:

当在一个分支上完成了像“重命名字段”这样的简单重构时,很难将更改合并到其他分支中。 (提取方法要困难得多,因为合并工具似乎不能很好地匹配未更改的块)

现在在我的梦想中,我正在考虑一种工具,它可以记录(或计算)在一个分支上已经完成了哪些明确定义的重构操作,然后在另一个分支上“重放”它们,而不是尝试合并重构影响的每一行。

另请参阅“Is there an intelligent 3rd merge tool that understands VB.NET" 了解我的另一半痛苦!


还有人尝试MolhadoRef (blog article about MolhadoRef and Refactoring-aware SCM) 之类的东西,理论上,这是具有重构意识的源代码控制。

【问题讨论】:

    标签: version-control refactoring merge branch


    【解决方案1】:

    您可以使用coccinelle 在不同的分支上执行相同类型的重构操作。它不会记录或弄清楚自己正在做什么,你必须明确告诉它要做什么,但除此之外,它会或多或少毫不费力地对你指向的许多分支进行相同的重构。

    此工具已在linux内核中用于updating API usage等。

    引用其网页:

    "Coccinelle 是一个程序匹配和 转换引擎,它提供 语言 SmPL(语义补丁 语言)用于指定所需 C 代码中的匹配和转换。”

    【讨论】:

    • 可惜它不适用于 C# 或 VB.NET,但至少其他人已经考虑过这个问题。
    【解决方案2】:

    Darcs 支持提交中的“token replace”操作,该操作将一个令牌的所有实例替换为另一个,并按照您的需要合并。

    【讨论】:

    • “令牌替换”的问题是需要考虑范围以进行安全重命名
    【解决方案3】:

    Araxis Merge 不懂常见的重构,但它是我用过的唯一三路合并工具。它适用于 Mac 和 Windows,它支持自动化 API,所以我想如果你愿意的话,你可以用它做你想做的事。郑重声明,除了使用他们的产品外,我与 Araxis 没有任何联系。

    【讨论】:

    • 我们发现 Araxis Merge 是最好的传统合并工具之一。 (自动化 API 无济于事,因为它需要重构工具来“拥有”问题)
    【解决方案4】:

    Plastic SCM (www.plasticscm.com) 3 路合并工具实现了 Xmerge,它是唯一能够帮助您合并已移动代码的工具。

    【讨论】:

      【解决方案5】:

      现在有一些更好的基于语言解析的合并工具(例如SemanticMerge),旨在处理已移动和修改的代码。 JetBrains(ReShaper 的创建者)刚刚在此发布了 blog

      这些年来有很多research终于有些产品即将上市。

      【讨论】:

        【解决方案6】:

        在 Linux 中,您可以使用 Meld 或在 Windows 中使用 Winmerge

        无论如何,这两个工具都只能“理解”文本行。重构需要一种理解代码的方式,这超出了我所知道的任何合并/比较工具。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-26
          • 2010-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多