我的项目中有2个分支:A(主)和B。在分支B中,master中的某些文件已被删除。我希望避免在母版中对B中已删除的文件进行更改时发生合并冲突。
我已将文件添加到.gitattributes
,例如
README.adoc merge=ours
对于我的合并驱动程序
[merge "ours"]
name = Always keep mine during merge
driver = true
但是我仍然遇到冲突,我无法弄清楚自己在做错什么。
git merge master
CONFLICT (modify/delete): README.adoc deleted in HEAD and modified in master. Version master of README.adoc left in tree.
我在做什么错?我已经运行git check-attr
,它显示了
README.adoc: merge: ours
我也尝试过GIT_TRACE=2
,但是它没有提供有用的信息;它只会告诉我从哪里获取二进制文件。
答案 0 :(得分:1)
modify/delete
冲突是高级冲突。 .gitattributes
中定义的合并驱动程序仅用于解决低级冲突:仅当文件(a)存在于所有三个版本(基础和两个分支技巧)中时,才使用合并驱动程序)和(b)在所有三个版本中都不同。在这里,该文件存在两个版本(基础版本和一个分支提示),并且在这两个版本中有所不同,但是仅将第三个版本完全删除,并且永远不会调用合并驱动程序。
对于recursive
,resolve
和subtree
策略,高级别冲突始终会导致合并冲突和进程中的暂停合并。高层次冲突根本不会发生在ours
策略中(-s ours
,与-X ours
扩展选项非常不同),因为它只关注当前树。 octopus
中的高级冲突是致命的:我认为章鱼合并会完全终止。 2
当A中对B中已删除的文件进行更改时,我想避免合并冲突。
为此,您必须编写合并策略。这很难。 1 参见我对git "trivial" merge strategy that directly commits merge conflicts的回答。
1 我对“困难”的主要证据是Git随附以下五种策略,即resolve
,recursive
,ours
,{ {1}}和octopus
-尽管经过十多年的发展,Git仍然只有这五个策略。
2 我从没真正做过章鱼合并,所以我的经验有限。