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)
所以,现在我们可以合并orange和pear'在一起,形成:
_ apple
p pear
_ kiwi
o orange
_ strawberry
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以解决这个问题,以便保持订购吗?我还想到pear下游orange必须orange始终获得优先权并且不再存在合并冲突.但这是一个错误的依赖,因为orange它pear是两个独立的功能分支.
一个可以在另一个之前被主导到主干,但是这不会解决集成分支.
编辑:我突然意识到可以保留的两个帅哥(只有我猜?)可能有两个合并策略称为"我先"和"你先",这样可以在两个之间以非交互方式解决模糊排序分支机构.
基本方法是定义自定义合并工具,然后使用git属性功能告诉git为这些文件使用该自定义合并工具.
例:
创建一个测试存储库:
$ git init t
$ cd t
Run Code Online (Sandbox Code Playgroud)定义名为的自定义合并工具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更多信息,请参阅
告诉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)在三个分支上制作一些测试数据:
$ 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)合并分支(注意没有冲突!):
$ git checkout master
$ git merge orange
$ git merge pear
Run Code Online (Sandbox Code Playgroud)利润!
$ cat foo.txt
apple
kiwi
orange
pear
strawberry
Run Code Online (Sandbox Code Playgroud)