CONFLICT (directory) 是 Git 在目录结构变更时产生的冲突,非代码行级冲突,源于两分支对同一路径执行互斥操作(如一方删除目录、另一方修改其内容,或双方重命名/新建同名目录);需通过 git status 定位类型(both deleted/renamed in both/added in both),用 git ls-files -u 查看 stage 状态,人工决策路径归属并 git add 显式标记解决。

git merge 报 CONFLICT (directory) 是什么情况
这不是代码行级冲突,而是 Git 在处理目录重命名、删除或移动时产生的结构冲突。典型现象是:CONFLICT (directory) 后跟类似 merge.txt: both modified 或 src/: renamed in both 的提示。它说明两个分支对同一个路径做了互斥操作——比如一个分支删了 lib/ 目录,另一个分支在 lib/ 里新增了文件;或者双方都把 utils.js 移到了不同子目录下。
怎么快速定位和理解目录冲突
先运行 git status,注意输出中带 both deleted、renamed in both、added in both 的条目。这些不是普通修改,而是 Git 对路径变更的分类标记:
-
both deleted:两边都删了同一目录,但目录下有未被 Git 跟踪的文件(比如构建产物),Git 不敢自动清理 -
renamed in both:两边都对同一文件/目录做了重命名,但目标路径不同(如 A →src/api/,B →src/network/) -
added in both:两边都在同一路径新建了同名目录,但内容不同
用 git ls-files -u 可看到冲突路径对应的多个 stage(1=base,2=ours,3=theirs),帮助判断祖先版本和双方变更来源。
手动解决目录冲突的实操步骤
Git 不会自动合并目录结构,必须人工决策路径归属。常见处理方式:
- 如果一方删了目录,另一方改了里面文件:确认是否真要删除——若需保留,就恢复该目录(
git checkout --ours -- path/to/dir),再手动合并文件改动 - 如果双方都重命名了同一文件:选一个目标路径作为最终位置,用
git mv统一移动,并把另一份内容合并进去 - 如果两边都新建同名目录:检查内容是否重复,保留一个,把另一个目录里的必要文件剪切过去,再
git rm -r删除冗余目录 - 切忌直接
rm -rf冲突目录——Git 还在跟踪它,硬删会导致后续git add失败
每处理完一个路径,必须用 git add 显式标记解决,否则 git commit 会报 fatal: cannot do a partial commit during a merge。
rerere 对目录冲突有用吗
基本没用。rerere 只记录行级内容冲突的解决方式,对路径变更类冲突不生效。它存的是文本块哈希与解决结果的映射,而目录冲突涉及的是索引(index)中路径条目的状态变更,不在 rerere 的捕获范围内。启用 git config --global rerere.enabled true 后,它只会帮你跳过曾经见过的 类文本冲突,对 <code>CONFLICT (directory) 完全无视。
这类冲突本质是设计分歧,得靠人理清模块职责、约定目录规范,而不是靠工具绕过。


















