git-rebase/merge/cherry选择一个重新排列代码块的提交

git-rebase/merge/cherry选择一个重新排列代码块的提交,git,Git,假设主分支和要素分支最初具有相同的代码段: Block A Block B 其中块A和块B可以是任意代码行。现在,在主分支中,块A已更改,例如 **Block A** Block B 然后,在特征分支中,块A在块B之后移动,即 Block B Block A git认为我正在做的是删除块A并在块B之后添加一些新行,所以如果我尝试 将特征分支合并到主分支 在主节点上重新设置要素分支的基础,或 主分支中的樱桃拾取功能 发生冲突时: <<<<<<< HE

假设主分支和要素分支最初具有相同的代码段:

Block A
Block B
其中块A和块B可以是任意代码行。现在,在主分支中,块A已更改,例如

**Block A**
Block B
然后,在特征分支中,块A在块B之后移动,即

Block B
Block A
git认为我正在做的是删除块A并在块B之后添加一些新行,所以如果我尝试

  • 将特征分支合并到主分支
  • 在主节点上重新设置要素分支的基础,或
  • 主分支中的樱桃拾取功能
  • 发生冲突时:

    <<<<<<< HEAD
    **Block A**
    =======
    >>>>>>> Move Block A behind Block B
    Block B
    Block A
    
    >将块A移到块B后面
    B区
    A区
    
    可能会发生冲突,但这里的问题是,git无法帮助更新块A中的更改。 有没有更好的解决办法?例如,不知何故,让git认为我正在删除块B并在块A之前添加内容


    (我欢迎任何关于更好标题的建议。)

    目前,没有比在合并时解决冲突更好的方法了:只需从合并的两个“侧面”选择新的块a代码和更新的块B代码。(如果您将
    merge.conflictStyle
    设置为
    diff3
    ,这样您就可以在冲突文件中看到代码在合并基础版本中的布局。如果您使用各种合并工具,这可能不会有任何区别,因此是否将
    merge.conflictStyle
    设置为
    diff3
    取决于您。)

    未来更智能的diff和merge算法可能会解决这个问题,并为您提供一个更简单的合并冲突来解决,甚至可以自己解决。但这在今天的Git中是不可用的。

    或者一个不太聪明(但仍然比今天更聪明)的合并算法发现B在a之前移动,而不是在B之后移动。这可能不会导致冲突。;)