如何为删除的文件指定.gitattributes的git merge“我们的”策略?

时间:2019-11-08 13:29:54

标签: git

我的项目中有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,但是它没有提供有用的信息;它只会告诉我从哪里获取二进制文件。

1 个答案:

答案 0 :(得分:1)

modify/delete冲突是高级冲突。 .gitattributes中定义的合并驱动程序仅用于解决低级冲突:仅当文件(a)存在于所有三个版本(基础和两个分支技巧)中时,才使用合并驱动程序)和(b)在所有三个版本中都不同。在这里,该文件存在两个版本(基础版本和一个分支提示),并且在这两个版本中有所不同,但是仅将第三个版本完全删除,并且永远不会调用合并驱动程序。

对于recursiveresolvesubtree策略,高级别冲突始终会导致合并冲突和进程中的暂停合并。高层次冲突根本不会发生在ours策略中(-s ours,与-X ours扩展选项非常不同),因为它只关注当前树。 octopus中的高级冲突是致命的:我认为章鱼合并会完全终止。 2

  

当A中对B中已删除的文件进行更改时,我想避免合并冲突。

为此,您必须编写合并策略。这很难。 1 参见我对git "trivial" merge strategy that directly commits merge conflicts的回答。


1 我对“困难”的主要证据是Git随附以下五种策略,即resolverecursiveours,{ {1}}和octopus-尽管经过十多年的发展,Git仍然只有这五个策略。

2 我从没真正做过章鱼合并,所以我的经验有限。