Git merge:将文件与不同的文件合并

时间:2016-12-10 00:21:04

标签: git git-merge

我有2个分支A和B

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

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

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

3 个答案:

答案 0 :(得分: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”所示。

答案 1 :(得分:1)

当您将分支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

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

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

答案 2 :(得分:0)

我想有没有办法告诉Git确切的文件历史图是什么样的,因为它依赖于它自己的diff: Getting Git to follow renamed and edited files

我可能应该将ThingImpl.java的重命名与在分支A中更改ThingImpl.java分开,以避免此问题。

因为我必须手动合并。