如何结合subtree与merge driver解决分歧提交的合并冲突?
解决方案:自定义Merge Driver + 定向目录合并
一、修复 -X subtree 不生效的问题
-X subtree=<path> 是为跨仓库的子树合并设计的,不适合同仓库分支间的定向目录合并。要实现仅合并diary和poetry目录,用以下步骤替代:
先执行合并但不自动提交,用
ours策略忽略其他目录的差异:git merge --no-commit -s ours leaf这个命令会默认保留当前分支所有文件内容,仅标记合并为待提交状态。
手动拉取
leaf分支中diary和poetry目录的合并结果,触发自定义merge driver处理冲突:# 处理diary目录 git checkout leaf -- diary/ git merge-tree HEAD leaf diary/ | git apply - # 处理poetry目录 git checkout leaf -- poetry/ git merge-tree HEAD leaf poetry/ | git apply -
二、修复自定义Merge Driver合并后仍提示冲突的问题
你需要确保merge driver配置和.gitattributes规则完全生效:
检查
.gitconfig中的merge driver配置,确保命令返回值为0(表示合并成功):[merge "aggregate"] name = Aggregate merge driver for VimWiki diaries driver = cat %A %B > %C recursive = true自定义脚本/命令必须能正确合并两个版本文件(比如拼接同日日记内容),且执行后返回0,否则Git会判定合并失败。
确认
.gitattributes规则仅作用于目标目录,无优先级更高的规则覆盖:diary/** merge=aggregate poetry/** merge=aggregate若文件已正确合并但Git仍标记冲突,手动告知Git冲突已解决:
git add diary/ poetry/
三、完整合并流程
整合上述步骤的完整命令序列:
# 拉取远程分支最新内容 git fetch origin # 执行ours策略合并,忽略非目标目录差异 git merge --no-commit -s ours leaf # 合并diary目录(触发自定义merge driver) git checkout leaf -- diary/ git merge-tree HEAD leaf diary/ | git apply - # 合并poetry目录 git checkout leaf -- poetry/ git merge-tree HEAD leaf poetry/ | git apply - # 标记冲突已解决 git add diary/ poetry/ # 提交合并结果 git commit -m "Merge leaf branch: sync diary and poetry with aggregate merge"
额外优化:稀疏 checkout 简化日常维护
如果平时仅关注diary和poetry目录,可启用稀疏 checkout 避免拉取无关文件:
# 启用稀疏checkout git config core.sparseCheckout true # 设置仅拉取目标目录 echo "diary/" >> .git/info/sparse-checkout echo "poetry/" >> .git/info/sparse-checkout # 更新工作区 git read-tree -mu HEAD
内容的提问来源于stack exchange,提问作者croakouttatune
相关产品推荐
相关产品推荐

