重定向git中单个文件的合并

时间:2016-03-17 08:46:39

标签: git git-merge

是否可以在合并期间明确告诉git某个文件已被重命名或移动?

背景是我已经完成了一个重构,其中某个类已被推广,因此我没有一个名为" MyClass"的类,我现在有两个类" MyClassBase"和#34; MyClass"。几乎所有的逻辑都在" MyClass"已被转移到" MyClassBase"但是添加了一个虚拟方法" MyClass"实现

" MyClassBase"和#34; MyClass"驻留在单独的文件中(" MyClassBase.cs"和" MyClass.cs"),并且是它们各自文件中的唯一类。

现在的问题是,当我进行合并时,我在" MyClass.cs"中遇到了很多冲突。因为那个班级在硕士上有变化。但是,如果我能以某种方式告诉git文件的变化" MyClass.cs"在master上应该真正合并到文件" MyClassBase.cs",然后合并几乎是微不足道的。

2 个答案:

答案 0 :(得分:0)

由于提交已经完成,您可以添加一个虚拟提交(添加空行或甚至是解释更改的注释行)和解释提交消息,您是否详细说明了更改。 下次执行此类操作的正确方法是将此更改作为单个提交进行正确解释。

答案 1 :(得分:0)

我在这里描述了我最终做的事情。这不是一个非常通用的解决方案,但在我的情况下它运作得很好。

当我进行重构时,我已经在两个不同的阶段做出了改变。第一阶段包括将“MyClass.cs”重命名为“MyClassBase.cs”并修改新文件中类的名称。第二阶段包括添加新文件“MyClass.cs”,其中包含扩展“MyClassBase”的类。

现在我做的是回到第一阶段的变更集并创建一个临时合并分支。那时与master合并是微不足道的,因为git会识别文件已被移动。然后我回到原来的分支并与临时分支合并。由于所有更改现在已经在该分支上的“MyClassBase.cs”中,因此合并变得微不足道。

在git命令中,流程看起来像这样(其中“mybranch”是我正在进行更改的分支):

git mv MyClass.cs MyClassBase.cs
git commit -m "Renamed MyClass.cs to MyClassBase.cs"
git add MyClass.cs
git commit -m "Added MyClass.cs with subclass of MyClassBase."
git checkout HEAD^
git checkout -b tmpbranch
git merge origin/master
git checkout mybranch
git merge tmpbranch