重复执行代码移动以减轻合并冲突

在合并过程中遇到冲突时,git会显示基于文件的冲突,而不是已移动代码块(跨文件)中的实际冲突。

通常情况下,我们在移动的代码中进行了简单的修改。为了执行所需的合并,我们可以在执行合并之前应用在远程分支上发生的重构。这为我们解决了越来越少的有意义的冲突。

当给定--color-moved选项时,Git可以显示此类动作。

在合并之前,如何重用此功能在分支上应用移动?

在继续操作之前,我可以手动修复该编译程序。

sd6292000 回答:重复执行代码移动以减轻合并冲突

git merge进行工作时,它会:

  • 比较(git diff个合并基础提交与您当前(HEAD)个提交,并且
  • 将合并基础提交与您提供的哈希ID或名称的尖端提交进行比较。

这些比较的结果会引起冲突。

很遗憾,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,因此必须组合的两个差异是FI的差异以及F至{{1}的差异}。其中包含了由于重构所需的更改,并为您提供了

H

首先提交 A--B--C--D / \ ...--o--* I-----J <-- branch1 \ / / E--------F--G--H <-- branch2 是您真正想要的结果。

(通过提交消息文本)将两个提交J F都标记为“不要使用此提交进行构建”可能是明智的。 (您可以制作II,但随后使用历史记录重写来进行最终合并J,该合并具有父KD以及{ {1}},然后强制名称H指向最终合并J,以隐藏构造过程。如果您从不推送中间提交,那么以后没人会知道您做了这-这将使提交branch1的存在更加奇怪...)

更好的工具(尤其是可以处理代码运动的合并策略)会很好,但很难编写。

本文链接:https://www.f2er.com/3089907.html

大家都在问