【问题标题】:Automerge after patch apply with conflics补丁应用后自动合并有冲突
【发布时间】:2021-06-21 10:22:49
【问题描述】:

我有几个带有“完全相同”的 package.json 和几个配置文件的存储库。我在一个存储库中进行了更改,并希望将这些更改传播到其他存储库。我设法按照这些说明做了正确的事情:

  1. git format-patch HEAD^(来自带有更改的 repo)
  2. git remote add patch repo/with/changes(来自需要更改的repo)
  3. git fetch 补丁(来自需要更改的仓库)
  4. git am -3 path/to/patch/patch --ignore-whitespace --ignore-space-change(来自需要更改的仓库)
  5. 手动合并冲突(可视化工具)

问题出在最后一步——我也想自动化这一步。是否可以定义一些合并策略,例如“在与补丁连接的行上合并我们的,在所有其他冲突的行上合并他们的”?我在 package.json 文件上有相当简单的冲突,其中冲突的行来自补丁(我希望这些有),或者来自某些包的包名和版本(我希望它保持原样)。

我知道,最好想办法避免重复并将类似文件移动到某个共享包中,但是我不知道如何为“package.json”之类的部分做到这一点,以及是否值得它。对此问题的任何建议也非常感谢,但主要关注点仍然是补丁的“现状”问题。或者也许其他一些方法可以在不同 repos 的几乎一致的部分上传播更改。

我想要自动合并的示例如下所示(例如,在 package.json 中,其他文件合并时没有冲突并从补丁中获取更改,但我猜在其他情况下,其他文件中也可能存在类似问题)

来自第一个 repo(补丁来源)

{
    "name": "packageA", 
    ... 
    script A: "..." // <- patch changed something here
    ...             // <- patch changed something here
    script C: "..." // <- patch changed something here
    ...
    dependencies: { 
        somePackage: "versionA"
    }
}

从第二次回购

{
    "name": "packageB", // <- here is conflict, I want to leave "package B"
    ... 
    script A: "..." // <- here is conflict, I want to get it from patch
    ...             // <- here is conflict, I want to get it from patch
    script C: "..." // <- here is conflict, I want to get it from patch
    ...
    dependencies: { 
        somePackage: "versionB" // <-- here is conflict, I want to leave "versionB"
    }
}

【问题讨论】:

  • 我不确定您提出的策略是否有意义 - 根据定义,冲突会从合并的 双方 双方发生变化。也许您可以举一个例子说明您所看到的冲突类型,以及如何知道要保留哪些。您的过程似乎也很混乱:如果您从文件中手动应用补丁,则不需要同时添加和获取其他 repo 作为远程,所有信息都在补丁文件中。可能实际的解决方案是在您创建补丁时更加智能,这样一开始就可以减少冲突。
  • @IMSoP 如果我不添加和获取其他 repo 作为来源,我会遇到“致命:sha1 信息缺失或无用”错误。如果我不使用“-3”标志,它只会因“补丁不适用”错误而失败——我猜是因为它因为冲​​突而无法检测到更改的部分
  • 嗯...我认为的旁白开始听起来是您问题的核心:您正在使用一种旨在在存储库之间共享 history 的机制,但实际上只想分享一个变化
  • @IMSoP 我想自动合并的例子 "name": "packageA", ... script A: "..." +++ ... script C: "... " --- dependencies: { somePackage: "versionA" } "name": "packageB",
  • 如果您查看git commit format-patch 生成的补丁,它是否显示somePackage: "versionA" 行的更改?因为如果那条线没有改变,就不应该有任何冲突需要解决。我强烈怀疑您的问题来自您如何生成补丁;如果补丁只包含您实际想要更改的行,您可以使用“首选他们的”合并策略,但是您还有一些 知道不相关的其他更改,但看起来更多更改混帐。

标签: git git-merge merge-conflict-resolution git-merge-conflict git-patch


【解决方案1】:

我尝试了cherry-pick --strategy-option theirs 而不是am -3,它终于奏效了——合并没有任何冲突,满足我的所有需求。我不知道这些是合并策略功能还是我无法做出正确的补丁(看起来很正常)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2019-06-10
    • 2020-07-25
    • 2013-04-17
    • 2019-08-26
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多