【发布时间】:2021-06-21 10:22:49
【问题描述】:
我有几个带有“完全相同”的 package.json 和几个配置文件的存储库。我在一个存储库中进行了更改,并希望将这些更改传播到其他存储库。我设法按照这些说明做了正确的事情:
- git format-patch HEAD^(来自带有更改的 repo)
- git remote add patch repo/with/changes(来自需要更改的repo)
- git fetch 补丁(来自需要更改的仓库)
- git am -3 path/to/patch/patch --ignore-whitespace --ignore-space-change(来自需要更改的仓库)
- 手动合并冲突(可视化工具)
问题出在最后一步——我也想自动化这一步。是否可以定义一些合并策略,例如“在与补丁连接的行上合并我们的,在所有其他冲突的行上合并他们的”?我在 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