这是git的安全保护机制,非合并冲突;因工作区或暂存区存在未提交修改且与目标分支文件内容不一致,git拒绝覆盖以防数据丢失;解决方式依需求选择:保留则stash、丢弃则checkout -- .或reset --hard、局部丢弃则checkout -- 。

git checkout 切换分支时提示“Your local changes would be overwritten”
这不是合并冲突,但常被误认为是。Git 拒绝切换,是因为工作区或暂存区有未提交的修改,而目标分支里同名文件的版本和你本地不一致。硬切会丢数据,所以它拦住你。
解决方法取决于你是否还想保留这些修改:
- 想保留:先
git stash存起来,切完再git stash pop - 不想保留:用
git checkout -- .丢弃所有未暂存改动(慎用),或git reset --hard清空暂存+工作区(更危险) - 只丢某几个文件:用
git checkout -- <file></file>
注意:git checkout 在 2.23+ 版本已建议用 git switch 替代,但报错逻辑完全一致。
git merge 时出现 “CONFLICT (content)” 并塞满
这才是真·合并冲突。Git 发现两个分支都改了同一段代码,无法自动决定谁对,于是停在半路,把双方内容并排塞进文件里。
关键不是删标记,而是理解三块内容的位置含义:
到 <code>=======:你当前分支(比如main)里的内容-
=======到>>>>>> feature/login:待合并分支(比如feature/login)里的内容 - 中间没有“共同祖先”视图——这是纯文本编辑器的盲区,容易漏逻辑
别直接删标记后手写。先用 git status 看哪些文件冲突,再用 git diff 或 git mergetool 调出三方对比(推荐配置为 vscode 或 meld),比对着改中间区域。
用 git merge --abort 中断失败,提示 “You have not concluded your merge (MERGE_HEAD exists)”
说明你已开始合并,但没完成(没 git add + git commit),此时 Git 认为你还在“合并中”。git merge --abort 是最安全的退出方式,但它有个前提:工作区不能有额外改动。
如果 abort 失败,大概率是你在冲突期间又改了其他文件,或手动删过 .git/MERGE_HEAD。这时不要硬删 .git/MERGE_* 文件,风险极高。稳妥做法是:
- 备份当前工作区(复制整个目录)
- 运行
git reset --merge(比--abort更底层,能清理大部分残留) - 若仍卡住,检查
.git/rr-cache/是否存在,手动删掉(仅限调试环境)
记住:git merge --abort 不是万能回滚键,它依赖 Git 自身状态完整。
IDEA 里点 “Merge…”,右侧面板显示 “Local” 和 “Remote”,但中间空白或乱码
这是 IDEA 的合并界面默认不启用三方基础(common ancestor)对比。它只展示你本地和对方分支的快照,缺失“原始版本”这个参照系,导致你无法判断哪边删了东西、哪边加了逻辑。
必须手动开启三方视图:
- 打开
Settings → Version Control → Git - 勾选
Enable three-way merge for text files - 重启 IDEA,再点 Merge,中间面板就会出现 “Base” 分栏
否则你靠左右两栏猜“谁动了哪里”,十次有八次会合并错。尤其当一方做了重命名+修改、另一方只改内容时,没 Base 几乎必踩坑。











