【问题标题】:Java aware merge commandJava 感知合并命令
【发布时间】:2010-12-21 11:26:37
【问题描述】:

每次我在我的 SCM 中看到导入或方法签名更改(例如变量重命名)之类的冲突时,我想知道是否有类似语言感知的 diff/merge 方法可以处理更烦人的小更改发生在共享项目上。 有什么东西可以在 Unix 环境中更顺利地处理冲突吗?

【问题讨论】:

  • 好主意。听起来像是您下一个开源项目的概念:)
  • 好吧,“低悬的果实”案例是如此简单,以至于我仍然相信在我开始提出这个问题之前,一定有人已经想到了这一点。
  • 同意,这可能应该被关闭。并同意,我一直想知道为什么不能以这种方式使合并变得更智能。

标签: java git merge


【解决方案1】:

我同意如果存在这样的工具会很棒,但我知道没有。我认为没有的原因是因为每个 SCM(无论是 git、hg、bzr、svn 等)的合并算法都适用于最低公分母,即纯文本。为了让这些 SCM 工具真正理解语言的语法和语义,它们必须具备解析语言的能力。对于任何 SCM 来说,这似乎是一项太大的任务,无法包含解析 Java、C#、Python、Ruby、Groovy、C、C++ 等的能力,更不用说这些语言中的每一种在版本之间都有不同的语法(例如,Java 泛型直到 1.5 才存在)。因此,SCM 必须包括检测或配置为知道源代码所用语言和版本的能力。

我认为任何与语言相关的合并功能更有可能在 3rd 方合并工具中找到(例如 .gitconfig 中的合并 > 工具设置和 .hgrc 中的 ui > 合并设置)。该工具可以配置为知道您项目中的任何 .java 文件都是用 Java 1.6 编写的,然后使用 JDK 中的解析功能生成 AST 并执行一些“深入”分析更改是否有意义该语言的上下文。

【讨论】:

  • 是的,这就是我所说的“合并命令”。但问题仍然是是否有类似的东西。
【解决方案2】:

我正在寻找完全相同的东西。 那些合并工具供应商可能应该解决这种语义、语言感知的合并。如果没有,我将不得不成为其中之一:)

现在,作为一个穷人的把戏,我有时通过 Eclipse 的代码清理/组织导入/订单成员将 3 个文件(基础、我们的、他们的)预处理为它们的“规范形式”。

虽然有限,但效果很好:上次它将冲突数量减少到约 200 到 2。我计划将其包装到脚本中,并插入 git 的合并工具。

还编写了脚本自动解决 java 导入冲突,它只是保留导入的两侧并添加 cmets 来解释发生了什么以及要做什么:'组织导入'。

【讨论】:

  • 关于 java 导入冲突,我建议删除冲突的导入部分(甚至所有导入)并让 IDE 重新插入它们。您显然需要就一个通用的导入顺序达成一致才能使其正常工作。有时导入不是唯一的(例如,java.util.List 与 java.awt.List),但没有明显解决方案的情况非常罕见。 实际上,有一个更好的解决方案:只删除冲突标记,将可能重复的导入留在那里,最后让 IDE 清理它。
  • 是的,这就是我所做的(参考“还编写了脚本自动解决 java 导入冲突”)。无论如何,感谢您的澄清
【解决方案3】:

您可能希望让团队中的每个人共享相同的 IDE 设置,例如导入顺序、格式等,以避免从一开始就发生此类冲突。

【讨论】:

  • 这实际上并不能解决问题。例如,考虑一些 Java 代码“import a; import e;”。假设我添加“import b;”并且您添加“import c;”,两者都按正确的字母顺序排列。当需要合并时,我们会遇到合并冲突。如果我们同意按字母顺序导入导入,那么正确的合并是没有歧义的——但是这些工具会产生合并冲突,因为它们不了解编码约定。
  • 最常见的合并失败似乎是任何添加的代码与任何其他添加的代码在同一位置发生冲突。对于这种“添加所有的东西”应该有一个通用的解决方案!合并风格,适用于所有语法。 (默认包含所有插入,当合并发生在某个块或范围内时作为默认合并。)。
【解决方案4】:

git rebase 不能解决这个问题吗? 任何变量重命名都将计入相关的提交中。 git rebase 让你与上游提交保持​​同步。只要你经常变基(每天都这样?)你不应该遇到这样愚蠢的冲突,如果你是,它们可能是真正的冲突,Java语法解析器无法解决。

【讨论】:

  • Rebase 将更新任何预先存在的重命名变量的提及,但不会更新主题分支中提交添加的任何新提及。如果有大量的重命名,那可以涵盖很多。
【解决方案5】:

让任何人更容易登陆此页面。 这个问题是http://stackoverflow.com/questions/523307/semantic-diff-utilities的骗子(它在主要问题中得到了答复,但并不明显)

我知道的当前工具(上述任务的答案)是语义合并 - https://www.semanticmerge.com

还有https://www.devart.com/codecompare,和你想要的很接近

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2016-01-10
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多