【问题标题】:Git merge: merge a file with a different fileGit合并:将文件与不同的文件合并
【发布时间】:2016-12-10 00:21:04
【问题描述】:

我有 2 个分支 A 和 B

在分支 A 中,我将 Thing.java 重命名为 ThingImpl.java,并重写了 Thing.java,使其成为一个接口。我还在 ThingImpl.java 中添加了很多内容。

在分支 B 中,我编辑了 Thing.java 中的类

现在我正在尝试将我的更改从分支 A 合并到分支 B,它正在尝试将我的更改合并到接口 Thing.java 中,而不是将差异应用到 ThingImpl.java,这是它应该做的。有没有办法告诉 git 这样做?

【问题讨论】:

    标签: git git-merge


    【解决方案1】:

    这取决于这些文件的内容以及它们的变化程度。

    您可以指示 git merge 检测更难的重命名,方法是:

    git merge --no-ff -Xrename-threshold=15 -Xpatience -Xignore-space-change A
    

    -Xrename-threshold=15 是为了控制 15% 的相似度已经足以考虑两个文件重命名候选。

    但这不会涵盖所有用例,如“git fails to detect renaming”和“git merge with renamed files”所示。

    【讨论】:

    • 它对我不起作用。我猜 Thing.java 在两个分支中的编辑都太多了。
    • 没错:如果内容差异太大,git不会检测到重命名。
    • 我认为它不起作用,因为现在两个分支中都有一个文件 Thing.java,甚至没有进行重命名检测。
    【解决方案2】:

    当你将分支A合并到分支B时,预期的结果是有一个文件Thing.java,它与分支A中的版本相同,还有一个文件ThingImpl.java,它与分支A中的版本基本相同,但集成了对分支 B 所做的更改。

    最简单的就是这个:

    git checkout branch_B
    git mv Thing.java ThingImpl.java
    git commit -m "A technical change to make the upcoming merge possible."
    git merge branch_A
    

    现在您不再依赖于重命名检测。

    如果您的构建在辅助提交之后和合并之前失败,您可以修改构建过程以将重命名的文件考虑在内。

    【讨论】:

      【解决方案3】:

      我想没有办法准确地告诉 Git 文件历史图的样子,因为它依赖于自己的差异: Getting Git to follow renamed and edited files

      为了避免这个问题,我可能应该将 ThingImpl.java 的重命名与在分支 A 中对 ThingImpl.java 进行更改分开提交。

      因为它是我必须手动合并。

      【讨论】:

        猜你喜欢
        • 2014-01-28
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多