如何让 git 将来自不同分支的两个同名文件视为单独的文件?

How can I get git to treat two identically named files from different branches as separate files?

我有两个不同的 git 分支:master 和 feature。在 master 中,我们在名为 "Upgrade" 的文件中创建了一个 class。在功能方面,我们还创建了一个名为 "Upgrade" 的 class,但不幸的是它与另一个升级 class 具有不同的功能。这是我合并分支后才发现的。

我希望能够告诉 git 将两个不同的 class 作为单独的 class 放在不同的文件中。

rename Upgrade(master) -> Upgrade01
rename Upgrade(feature) -> Upgrade02

有办法吗?

如果我可以冒昧地改写这个问题,那就是:

Branches X and Y share a common history (a merge base commit B, specifically) in which file F did not exist. In some commit after B on branch X, a file F was created. In some commit after B on branch Y, a different file F was also created. Now, when on branch X, doing git merge Y, I get a merge conflict that says F was created on both branches. Can I get git merge to pretend that instead of creating F in X, we created F_X, and instead of creating F in Y, we created F_Y?

简短的回答是否定的,但有两种直接的方法可以处理它:

  1. 中止合并 (git merge --abort)。在分支 X 上,创建一个新的提交,将 F 移动到 F_X。在分支 Y 上,创建一个新的提交,将 F 移动到 F_Y。在此过程中进行任何其他适当的更改——这两个提交让您有机会在每个分支中分别测试所有内容。然后,像以前一样合并两个分支;这次没有"same file created"冲突。

  2. 继续合并,方法是从分支 X 的顶端检出 F 但(重新)命名它 F_X,然后检出 F 从分支的顶端 Y 但(重新)命名它 F_Y:

    $ git checkout HEAD -- F; git mv F F_X
    $ git checkout MERGE_HEAD -- F; git mv F F_Y
    

    (请注意,您可以使用任何其他方式命名分支提示提交,例如分支名称 XY 而不是 HEADMERGE_HEAD ; 请注意,在此处执行 git checkout 将解决索引中的合并冲突)。您可能还必须根据需要进行其他更改,就像您使用方法 (1) 所做的那样。

    完成所需的任何更改后,照常提交合并。

    此方法的缺点(如果可能的话我更喜欢方法 (1) 的原因)是生成的合并与 both "input sides" 有显着变化.如果合并后来被证明是错误的,这使得追踪(例如,平分)错误变得更加困难。如果您改为在两个分支中进行两组更改,然后合并,您可以将错误跟踪到一个更具体的更改——例如,可能错误仅在对分支 Y 所做的更改中——这可能会使 "future you"快乐多了。