Git merge时替换文件未触发冲突被直接覆盖,如何合并双分支内容?
为什么merge操作没有触发合并冲突
Git 触发合并冲突的核心前提是:两个分支从共同父节点分叉后,都对同一文件的相同/相邻行做了修改,且 Git 无法自动判断优先采用哪个版本。你遇到的情况属于快进合并(Fast-forward Merge),不会触发三路合并逻辑,因此不会产生冲突:
- 你在 master 分支提交 test.txt 的修改后,才基于当前 master 节点创建 NEW 分支,此时两个分支的指向完全一致
- 后续你仅在 NEW 分支对 test.txt 做了修改并提交,切回 master 后 master 分支没有产生任何新提交(或仅修改了其他文件、未改动 test.txt)
- 此时执行
git merge NEW时,Git 判定 master 可以直接将指针移动到 NEW 分支的最新提交节点,不需要做内容比对合并,所以直接用 NEW 分支的 test.txt 覆盖了原版本,不会触发冲突。
如何合并两个分支中 test.txt 的内容
按你当前的操作阶段选择对应方案即可:
还未执行 merge 操作
执行带非快进参数的合并命令,强制触发三路合并逻辑:
git merge --no-ff NEW
此时 Git 会检测到两个分支对 test.txt 的修改差异,自动触发冲突提示,按以下步骤操作即可:
- 打开 test.txt,找到被
<<<<<<< HEAD(当前 master 分支内容)、=======(分隔符)、>>>>>>> NEW(NEW 分支内容)标记的冲突段 - 手动编辑整合两边的内容,删除所有冲突标记
- 依次执行
git add test.txt、git commit完成合并
已经执行了 merge 操作
先回退到 merge 之前的 master 版本(仅 merge 后没有新提交时生效):
git reset --hard HEAD~1
再按上面「未执行 merge」的步骤操作即可。
内容的提问来源于stack exchange,提问作者Sagi
相关产品推荐
相关产品推荐

