配置.gitattributes合并规则后合并仍冲突,为何未生效?
为什么你的.gitattributes合并配置没生效?
我来帮你拆解下问题所在,其实是两个关键原因导致配置没按预期工作:
1. keys_manager的modify/delete冲突不在合并驱动的处理范围内
Git的合并驱动(比如你配置的merge=ours)只负责处理同一文件在两个分支都有内容修改的场景——也就是文件内容层面的冲突。而你遇到的CONFLICT (modify/delete)属于树结构冲突:你的当前分支(HEAD)删除了整个keys_manager目录,而对方分支修改了该目录下的文件。这种冲突是目录/文件存在性的矛盾,不属于文件内容冲突,所以Git根本不会触发你配置的merge=ours规则,直接抛出冲突。
如果要处理这类场景,你有几个选择:
- 合并时手动选择保留哪一方的版本;
- 使用
git merge -X ours(保留当前分支删除操作)或git merge -X theirs(保留对方分支的修改)选项,但注意这是全局作用于整个合并的,不是针对特定路径; - 编写自定义的合并钩子(比如
merge钩子)来自动处理这类存在性冲突。
2. js/README.md的merge=theirs规则缺少对应的驱动配置
你在.git/info/attributes里给js/README.md指定了merge=theirs,但你只在全局Git配置里设置了merge.ours.driver=true,完全没配置merge.theirs的驱动程序!
Git需要明确知道每个merge驱动该怎么执行,所以你得给merge.theirs也配置驱动:
# 配置merge.theirs驱动:直接用对方分支的文件覆盖当前分支的版本 git config --global merge.theirs.driver 'cp %B %A'
或者用更标准的git merge-file命令实现:
git config --global merge.theirs.driver 'git merge-file -L theirs -L base -L ours --theirs %A %O %B'
配置完成后,Git才会在遇到merge=theirs的文件时,自动用对方分支的版本解决内容冲突。另外也要确认.git/info/attributes里的路径js/README.md和仓库里的实际文件路径完全匹配(比如大小写、相对位置),路径不匹配的话规则也不会生效。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

