我希望能够通过首先放置“我们的”块然后将“他们的”块放在“他们的”块中来自动解决“两个分支在同一行添加块”的冲突。
所以不要像以下那样发生冲突:
16:09:44 tims@firebat ~/git/merge_conflict_example (master|MERGING) $ cat test.txt
good morning
good evening
<<<<<<< HEAD
g'day
=======
aloha
>>>>>>> branch1
hello
hi
我得到:
16:09:44 tims@firebat ~/git/merge_conflict_example (master) $ cat test.txt
good morning
good evening
g'day
aloha
hello
hi
没有冲突。
我认为可能有git merge branch1 -X oursthentheirs
我在这里使用的样本可以在git@bitbucket.org上找到:abznak / merge_conflict_example.git
答案 0 :(得分:2)
没有内置任何内容,但是如果你将merge.conflictstyle
设置为diff3
,编写一个程序会相对容易(或许在perl或python中,或者我会在awk中编写一个俗气的版本)检查“原始”部分是否为空 - 这将检测“两个已添加”的情况 - 如果是,则只删除冲突标记:
good morning
good evening
<<<<<<< HEAD
g'day
|||||||
=======
aloha
>>>>>>> branch1
hello
hi
这是我的awk脚本(我声称它不是很好,但它适用于示例输入)。请注意,它不会很好地处理“嵌套冲突”(即,如果两个原始冲突文件包含看起来像冲突标记的内容,则会出错)。
BEGIN { in_conflict = retained_left = retained_mid = retained_right = 0 }
function handle_retained(is_eof) {
# If the section between ||||||| and ======= is empty,
# retained_mid+1 == retained_right. Otherwise print
# all the retained conflict lines.
if (retained_mid + 1 == retained_right) {
s1 = retained_left + 1 # after <<<<<<<
e1 = retained_mid - 1 # before |||||||
s2 = retained_right + 1 # after =======
e2 = NR - 1 # before >>>>>>>
} else {
s1 = retained_left; e1 = NR
s2 = 1; e2 = 0
}
for (i = s1; i <= e1; i++)
print retained[i]
for (i = s2; i <= e2; i++)
print retained[i]
delete retained
if (is_eof) {
# this should never happen!
print "WARNING: ended input while still in conflict marker"
exit(1)
}
}
/^<<<<<<</ { in_conflict = 1; retained_left = NR }
{
if (!in_conflict)
print
else
retained[NR] = $0
}
/^\|\|\|\|\|\|\|/ { if (in_conflict) retained_mid = NR }
/^=======/ { if (in_conflict) retained_right = NR }
/^>>>>>>>/ { if (in_conflict) handle_retained(0); in_conflict = 0 }
END { if (in_conflict) handle_retained(1) }
答案 1 :(得分:1)
这很容易。只需将merge
gitattribute设置为union
即可。
来自https://git-scm.com/docs/gitattributes:
联合
为文本文件运行3向文件级别合并,但从两者中获取行 版本,而不是留下冲突标记。这往往会留下 在结果文件中以随机顺序添加行,用户应该 验证结果。如果你不明白,请不要使用它 影响。
对于该示例,我刚添加了一个包含文本*.txt merge=union
的.gitattributes文件:
10:58:21 tims@thor ~/git/merge_conflict_example (master) $ cat .gitattributes
*.txt merge=union
然后运行合并:
10:58:26 tims@thor ~/git/merge_conflict_example (master) $ git merge origin/branch1
Auto-merging test.txt
[...]
Merge made by the 'recursive' strategy.
test.txt | 1 +
1 file changed, 1 insertion(+)
具有预期的效果:
10:58:42 tims@thor ~/git/merge_conflict_example (master) $ cat test.txt
good morning
good evening
g'day
aloha
hello
hi
答案 2 :(得分:0)
您可以使用&#34;我们的&#34;合并,将分支旧分支到当前分支。合并 策略如下
$ git merge -s our old