如何解决 Git 合并冲突(merge conflict)

解决合并冲突四步:git status 看冲突文件 → 打开文件编辑冲突标记(<<<<<<< 当前分支 / ======= / >>>>>>> 对方分支)→ git add 标记已解决 → git commit 完成合并。工具辅助:git mergetool 或 IDE 内置合并工具。

最佳实践
Git 分支协作与合并示意

常见内容冲突是同一处代码两边都改了,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 也不能代替完整的逐父提交复核。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台