在合并过程中遇到冲突时,git
会显示基于文件的冲突,而不是已移动代码块(跨文件)中的实际冲突。
通常情况下,我们在移动的代码中进行了简单的修改。为了执行所需的合并,我们可以在执行合并之前应用在远程分支上发生的重构。这为我们解决了越来越少的有意义的冲突。
当给定--color-moved
选项时,Git可以显示此类动作。
在合并之前,如何重用此功能在分支上应用移动?
在继续操作之前,我可以手动修复该编译程序。
在合并过程中遇到冲突时,git
会显示基于文件的冲突,而不是已移动代码块(跨文件)中的实际冲突。
通常情况下,我们在移动的代码中进行了简单的修改。为了执行所需的合并,我们可以在执行合并之前应用在远程分支上发生的重构。这为我们解决了越来越少的有意义的冲突。
当给定--color-moved
选项时,Git可以显示此类动作。
在合并之前,如何重用此功能在分支上应用移动?
在继续操作之前,我可以手动修复该编译程序。
git merge
进行工作时,它会:
git diff
个合并基础提交与您当前(HEAD
)个提交,并且这些比较的结果会引起冲突。
很遗憾,git merge
的内部合并算法不支持已移动的代码:它仅适用于插入和删除操作。
幸运的是,您不必合并两个分支技巧。我想这就是您在这里得到的:
要执行所需的合并,我们可以在执行合并之前应用在远程分支上发生的重构。
如果在提交时涉及到将代码从一个文件移动到另一个文件的重构,则首先 just 移动代码,然后然后进行所需的任何更改您可以分两步进行合并。
具体来说,假设我们有这个:
A--B--C--D <-- branch1
/
...--o--*
\
E--F--G--H <-- branch2
其中branch1
具有重构前代码(从合并基础提交*
继承),branch2
具有重构后代码。
如果重构完全发生在提交G
中,并且包括将和更改代码从一个文件移动到另一个文件,则您将陷入困境。但是假设重构首先在提交F
中执行“移动代码”,然后在提交G
中进行“更改代码”。要将branch2
合并到branch1
中,请运行:
git checkout branch1
git merge <hash-of-F>
此时,合并仅需要将代码从一个文件移动到另一个文件,正如您已经指出的那样,手动合并更容易。
提交结果(在所有手合并之后)得出:
A--B--C--D
/ \
...--o--* I <-- branch1
\ /
E--------F--G--H <-- branch2
现在完成了,您可以这样做:
git merge branch2
与提交H
合并。此操作的合并基础为提交F
,因此必须组合的两个差异是F
至I
的差异以及F
至{{1}的差异}。其中包含了由于重构所需的更改,并为您提供了
H
首先提交 A--B--C--D
/ \
...--o--* I-----J <-- branch1
\ / /
E--------F--G--H <-- branch2
是您真正想要的结果。
(通过提交消息文本)将两个提交J
和 F
都标记为“不要使用此提交进行构建”可能是明智的。 (您可以制作I
和I
,但随后使用历史记录重写来进行最终合并J
,该合并具有父K
和D
以及{ {1}},然后强制名称H
指向最终合并J
,以隐藏构造过程。如果您从不推送中间提交,那么以后没人会知道您做了这-这将使提交branch1
的存在更加奇怪...)
更好的工具(尤其是可以处理代码运动的合并策略)会很好,但很难编写。