如何解决 Git 合并冲突(merge conflict)
解决合并冲突四步:git status 看冲突文件 → 打开文件编辑冲突标记(<<<<<<< 当前分支 / ======= / >>>>>>> 对方分支)→ git add 标记已解决 → git commit 完成合并。工具辅助:git mergetool 或 IDE 内置合并工具。
常见内容冲突是同一处代码两边都改了,Git 无法自动决定结果;重命名/删除、二进制等冲突也可能没有文本标记。 流程:打开冲突文件 → 找到 <<<<<<<、=======、>>>>>>> 标记 → 编辑成想要的样子 → git add → git commit。
认识冲突标记
<<<<<<< HEAD
当前分支的内容
=======
对方分支(被合入)的内容
>>>>>>> feature-x
你要做的是把整段(含标记行)替换成最终想要的内容——可以二选一、两者融合、或重写。
标准流程
git merge feature-x
# CONFLICT (content): Merge conflict in src/app.js
git status # 看有哪些冲突文件(both modified)
vim src/app.js # 编辑,删掉标记,保留正确内容
git add src/app.js # 标记为已解决
git diff --cached --check # 检查待提交内容中的冲突标记和空白错误
git diff --cached # 复查实际暂存内容
git commit # 完成合并提交(信息已预填)
工具辅助
- VS Code:冲突处直接显示 "Accept Current / Incoming / Both" 按钮;
- git mergetool:调起配置的合并工具(vimdiff、meld 等);
- 整文件站队:
git checkout --ours 文件、--theirs选择整份文件版本,随后仍需检查并 git add。普通 merge 中分别对应当前分支与被合入分支;rebase 中 ours 是已重放到的上游一侧,theirs 是当前正重放的提交,不能按原分支名称直觉判断。
不想合了
git merge --abort # 尝试恢复合并前状态;合并前已有未提交改动时不保证完整恢复
常见问题(FAQ)
Q:为什么同一个文件反复冲突?
两个分支长期并行大改同一文件。治本:勤同步(定期 merge/rebase main)、大文件拆分、格式化类改动单独成批做。
Q:rebase 冲突和 merge 冲突解决方式一样吗?
编辑方式相同,流程略不同:解决后 git add 然后 git rebase --continue(不是 commit),而且可能需要解决多轮。
Q:解决完如何确认没解错?
提交前用 git diff --cached 复查并运行测试;--check 通过不代表语义正确。合并后分别用 git diff HEAD^1 HEAD 与 git diff HEAD^2 HEAD 检查相对两个父提交的结果。git diff origin/main...HEAD 看的是分支差异,git show HEAD 默认的 combined diff 也不能代替完整的逐父提交复核。