如何让 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
?
简短的回答是否定的,但有两种直接的方法可以处理它:
中止合并 (git merge --abort
)。在分支 X
上,创建一个新的提交,将 F
移动到 F_X
。在分支 Y
上,创建一个新的提交,将 F
移动到 F_Y
。在此过程中进行任何其他适当的更改——这两个提交让您有机会在每个分支中分别测试所有内容。然后,像以前一样合并两个分支;这次没有"same file created"冲突。
继续合并,方法是从分支 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
(请注意,您可以使用任何其他方式命名分支提示提交,例如分支名称 X
和 Y
而不是 HEAD
和 MERGE_HEAD
; 请注意,在此处执行 git checkout
将解决索引中的合并冲突)。您可能还必须根据需要进行其他更改,就像您使用方法 (1) 所做的那样。
完成所需的任何更改后,照常提交合并。
此方法的缺点(如果可能的话我更喜欢方法 (1) 的原因)是生成的合并与 both "input sides" 有显着变化.如果合并后来被证明是错误的,这使得追踪(例如,平分)错误变得更加困难。如果您改为在两个分支中进行两组更改,然后合并,您可以将错误跟踪到一个更具体的更改——例如,可能错误仅在对分支 Y 所做的更改中——这可能会使 "future you"快乐多了。
我有两个不同的 git 分支:master 和 feature。在 master 中,我们在名为 "Upgrade" 的文件中创建了一个 class。在功能方面,我们还创建了一个名为 "Upgrade" 的 class,但不幸的是它与另一个升级 class 具有不同的功能。这是我合并分支后才发现的。
我希望能够告诉 git 将两个不同的 class 作为单独的 class 放在不同的文件中。
即
rename Upgrade(master) -> Upgrade01
rename Upgrade(feature) -> Upgrade02
有办法吗?
如果我可以冒昧地改写这个问题,那就是:
Branches
X
andY
share a common history (a merge base commitB
, specifically) in which fileF
did not exist. In some commit afterB
on branchX
, a fileF
was created. In some commit afterB
on branchY
, a different fileF
was also created. Now, when on branchX
, doinggit merge Y
, I get a merge conflict that saysF
was created on both branches. Can I getgit merge
to pretend that instead of creatingF
inX
, we createdF_X
, and instead of creatingF
inY
, we createdF_Y
?
简短的回答是否定的,但有两种直接的方法可以处理它:
中止合并 (
git merge --abort
)。在分支X
上,创建一个新的提交,将F
移动到F_X
。在分支Y
上,创建一个新的提交,将F
移动到F_Y
。在此过程中进行任何其他适当的更改——这两个提交让您有机会在每个分支中分别测试所有内容。然后,像以前一样合并两个分支;这次没有"same file created"冲突。继续合并,方法是从分支
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
(请注意,您可以使用任何其他方式命名分支提示提交,例如分支名称
X
和Y
而不是HEAD
和MERGE_HEAD
; 请注意,在此处执行git checkout
将解决索引中的合并冲突)。您可能还必须根据需要进行其他更改,就像您使用方法 (1) 所做的那样。完成所需的任何更改后,照常提交合并。
此方法的缺点(如果可能的话我更喜欢方法 (1) 的原因)是生成的合并与 both "input sides" 有显着变化.如果合并后来被证明是错误的,这使得追踪(例如,平分)错误变得更加困难。如果您改为在两个分支中进行两组更改,然后合并,您可以将错误跟踪到一个更具体的更改——例如,可能错误仅在对分支 Y 所做的更改中——这可能会使 "future you"快乐多了。