【问题标题】:resolve git conflicts for particular files by automatic merge all changes通过自动合并所有更改来解决特定文件的 git 冲突
【发布时间】:2016-11-24 22:35:44
【问题描述】:

有一个项目使用 github 存储库。当在合并拉取请求之前有冲突需要解决时,大约 90% 的冲突案例只涉及一个包含已完成票证列表的 CHANGELOG 文件,例如:

## current

<<<<<<< HEAD
ISSUE-128 done some 128
ISSUE-131 done some 131
=======
ISSUE-125 done some 125
>>>>>>> ISSUE-125
ISSUE-126 done some 126
ISSUE-120 done some 126
ISSUE-123 done some 126

我想知道是否有一种方法可以自动合并此特定文件(可能通过使用 ie gitignore 格式提供一些配置)并使用简单的规则来接受双方的更改(至于顺序足以让更改将彼此相邻,知道如何控制顺序是次要的,但很有趣)。附加规则可以是验证是否总是在每一侧只有一个添加,然后才继续进行自动合并。

理想情况下是在 github 上进行这样的配置,但即使是本地 git 解决方案也会有所帮助。

【问题讨论】:

  • 你想要的通常被称为 union merge,它实际上是内置在 Git 中的。它很少做正确的事情,但对于这种特殊情况,联合合并实际上可能是正确的。见stackoverflow.com/q/13263902/1256452
  • 看起来这正是我所需要的,包括配置文件集的可能性。如果你写一个,我很乐意接受答案:)
  • 实际上我唯一仍然担心的是,对于“更复杂”的冲突,我宁愿看到有冲突要合并

标签: git github merge pull-request


【解决方案1】:

这个问题经常出现;除了 Changelog 样式文件之外,例如,如果您有源文件并添加新内容,也会发生这种情况 - 大多数情况下,您会在某个规范的位置(如文件末尾附近)添加新方法或其他任何内容,并在合并时将它们全部每次都表现为冲突。

简短回答:git 在这里无法帮助您,任何其他自动合并工具也无法帮助您,缺乏真正的人工智能。在其他地方提到了union 驱动程序,但坦率地说,这对我来说是非常危险的,即使对于变更日志文件也是如此。您可以使用理解您的 Changelog 格式的自定义合并驱动程序来执行此操作,但这样做可能会让您放弃这个想法(如果是这样,gitattributes 手册页会为您提供更多信息)。

侧面答案/提示:我在源文件中使用这样的 cmets 取得了一些成功:

  def lastmethodinclass
    ...
  end

  ## placeholder 1 ##

  ## placeholder 2 ##

  ## placeholder 3 ##

end # class

然后,在第一个分支中,我在“占位符 1”后面放置了一个新方法。如果我后来记得,在另一个分支中,我已经“用完”了第一个占位符,我将下一个方法放在第二个占位符之后,依此类推。

这仍然很尴尬,但它可以避免那些讨厌的冲突。有时,我会清除合并后积累的旧占位符,并将它们塞回它们所属的位置。

与他人编码时没用,是的。

【讨论】:

    【解决方案2】:

    [答案,根据 cmets 稍作修改。]

    您在这里想要的通常称为 union merge,这实际上是内置于 Git 中的。它很少做正确的事情,但对于这种特殊情况,联合合并实际上可能是正确的。您可以使用.gitattributes 为特定文件名设置联合合并。有关更多信息,请参阅git merge, keep both

    实际上,我唯一仍然担心的是,对于“更复杂”的冲突,我宁愿看到存在要合并的冲突

    对:我认为联合合并的主要问题是它总是成功,即使合并结果是荒谬的。需要记住是这样设置的,每次都要小心查看合并结果。

    (个人而言,如果 Git 将其拆分为一个可以在每个文件上调用的单独“解析”命令,我会更高兴。我认为 git merge-file 命令实际上是人们想要的在这里,除了使用起来很痛苦。有了一个更好用的界面,而不是-X ours-s ours-X theirs等,以及.gitattributes中的各种合并驱动程序,我们可以让合并冲突发生,检查它们,如果足够了,决定保留哪一边,然后继续。当然,如果沿着这条路走得更远,最终会得到一个 GUI 合并工具...)

    【讨论】:

    • 您提供的所有信息让我想知道是否可以定义自定义合并驱动程序,该驱动程序将在 github 上运行,因为对于任何更复杂的情况都会失败,因此 github 将显示有冲突需要解决的消息,对于“简单案例”,只有绿色按钮允许执行合并。我可能会尝试准备这样的.gitattributes 配置...
    猜你喜欢
    • 2014-09-17
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2019-08-26
    • 2010-10-06
    相关资源
    最近更新 更多