【问题标题】:Merge drivers don't work when merging into default branch合并到默认分支时,合并驱动程序不起作用
【发布时间】:2021-10-09 02:00:25
【问题描述】:

我有一个名为 prod 的默认分支,master 是我的开发分支。我已经通过git config merge.ours.driver true 配置了合并驱动程序ours。这就是添加到我的配置中的内容:

配置:

[merge "ours"]
    driver = true

我希望cfg.json 在合并时不受影响,因此我还配置、提交甚至将.gitattributes 推送到两个分支:

.gitattributes:

cfg.json merge=ours

现在,这只有在我将 prod 与 master 合并时才有效(我在 master,我运行 git merge prod),但反过来就不行了(我在 @ 987654333@,我跑git merge master,cfg.json is changed regardless of all my efforts)

我相信我在这个问题上尝试了每一个 StackOverflow 解决方案,尝试了很多文章,但它在这个非常具体的场景中不起作用。这是预期的行为吗?

【问题讨论】:

    标签: git merge git-merge


    【解决方案1】:

    从您的问题中不清楚这是否正在发生,但我认为您遇到了 Git 合并如何工作的怪癖。在合并中,Git 只考虑三个点:两个头和合并基,它通常是最近的共同祖先。

    当 Git 进行合并时,如果文件的一侧更改而另一侧未更改,Git 将采用更改后的版本,而根本不调用任何合并功能,包括自定义合并驱动程序。那是因为,当你使用三路合并时,如果一侧改变而另一侧不变,则采用改变后的版本。

    在您的情况下,您尝试做的是一个坏主意,Git 开发人员建议人们不要这样做。如果你想要一个配置文件的两个不同版本,要么使用一个模板文件并从中生成一个忽略的配置文件,要么将两个版本都包含到存储库中,然后通过一种外部方式选择在每个环境中使用哪个版本存储库。当您进行合并时,尝试像这样保留文件的两个版本是行不通的。

    【讨论】:

    • 看起来你对 Git “怪癖”的看法是正确的。我喜欢生成器解决方案,我编写了一个小的 Node.js 脚本,它基于内联参数 (process.argv) 读取、配置和写入一个被忽略的配置文件。我在 package.json 中创建了一些脚本,现在可以在模式之间快速切换。谢谢你的想法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多