如何解决 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 commit # 完成合并提交(信息已预填)
工具辅助
- VS Code:冲突处直接显示 "Accept Current / Incoming / Both" 按钮;
- git mergetool:调起配置的合并工具(vimdiff、meld 等);
- 整文件站队:
git checkout --ours 文件全用我方版本,--theirs全用对方。
不想合了
git merge --abort # 回到合并前,当无事发生
常见问题(FAQ)
Q:为什么同一个文件反复冲突?
两个分支长期并行大改同一文件。治本:勤同步(定期 merge/rebase main)、大文件拆分、格式化类改动单独成批做。
Q:rebase 冲突和 merge 冲突解决方式一样吗?
编辑方式相同,流程略不同:解决后 git add 然后 git rebase --continue(不是 commit),而且可能需要解决多轮。
Q:解决完如何确认没解错?
git diff origin/main...HEAD 复查改动面;跑测试。合并提交本身可以 git show HEAD 检查。