合并新代码的冲突解决方案

Mar*_*las 5 git version-control merge

假设我有一些订购的代码,但订购不是技术要求.

apple
kiwi
strawberry
Run Code Online (Sandbox Code Playgroud)

然后我有两个我要合并的主题,其差异如下:

TOPIC BRANCH: orange
  kiwi
+ orange
  strawberry
Run Code Online (Sandbox Code Playgroud)

并且

TOPIC BRANCH: pear
  kiwi
+ pear
  strawberry
Run Code Online (Sandbox Code Playgroud)

有没有办法让这两个补丁自动解决?在我看来,这是一场合并冲突,因为他们争夺同一条新线.我提出的解决方案是重新排序其中一个更改,因为排序顺序只是一个软要求(水果实际上是函数定义).

 TOPIC BRANCH: pear'
   apple
 + pear
   kiwi
Run Code Online (Sandbox Code Playgroud)

所以,现在我们可以合并orangepear'在一起,形成:

 _ apple
 p pear
 _ kiwi
 o orange
 _ strawberry
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以解决这个问题,以便保持订购吗?我还想到pear下游orange必须orange始终获得优先权并且不再存在合并冲突.但这是一个错误的依赖,因为orangepear是两个独立的功能分支.

一个可以在另一个之前被主导到主干,但是这不会解决集成分支.

编辑:我突然意识到可以保留的两个帅哥(只有我猜?)可能有两个合并策略称为"我先"和"你先",这样可以在两个之间以非交互方式解决模糊排序分支机构.

Ric*_*sen 7

基本方法是定义自定义合并工具,然后使用git属性功能告诉git为这些文件使用该自定义合并工具.

例:

  1. 创建一个测试存储库:

    $ git init t
    $ cd t
    
    Run Code Online (Sandbox Code Playgroud)
  2. 定义名为的自定义合并工具mymerge:

    $ git config merge.mymerge.name "my custom merge tool"
    $ git config merge.mymerge.driver "cat '%A' '%B'|sort -u >'%A'.tmp && mv '%A'.tmp '%A'"
    
    Run Code Online (Sandbox Code Playgroud)

    上面的合并工具连接文件,对生成的行进行排序,然后删除重复的行.如果您不想更改顺序,请将上述命令替换为您想要的自定义脚本.有关git help attributes更多信息,请参阅

  3. 告诉git mymerge在合并foo.txt存储库中指定的任何文件时要使用它:

    $ echo "foo.txt merge=mymerge" >.gitattributes
    $ git add .gitattributes
    $ git commit -m "tell git to use the mymerge merge tool for foo.txt"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在三个分支上制作一些测试数据:

    $ printf 'apple\nkiwi\nstrawberry\n' >foo.txt
    $ git add foo.txt
    $ git commit -m "common ancestor version of foo.txt"
    $ git checkout -b orange
    $ printf 'apple\nkiwi\norange\nstrawberry\n' >foo.txt
    $ git commit -a -m "add orange"
    $ git checkout -b pear master
    $ printf 'apple\nkiwi\npear\nstrawberry\n' >foo.txt
    $ git commit -a -m "add pear"
    
    Run Code Online (Sandbox Code Playgroud)
  5. 合并分支(注意没有冲突!):

    $ git checkout master
    $ git merge orange
    $ git merge pear
    
    Run Code Online (Sandbox Code Playgroud)
  6. 利润!

    $ cat foo.txt
    apple
    kiwi
    orange
    pear
    strawberry
    
    Run Code Online (Sandbox Code Playgroud)