在团队协作开发中,Git 是最常用的版本控制工具,但多人同时修改同一文件时,难免会遇到代码冲突(Conflict)。如何高效解决冲突,是每个开发者必须掌握的技能。
本文将系统讲解 Git 代码冲突的产生原因、解决方案、预防技巧,并通过代码示例和实战演示,帮助你彻底掌握冲突处理流程。
当多个开发者修改了同一文件的同一部分代码,并尝试合并(merge/rebase/pull)时,Git 无法自动决定保留哪个版本,就会提示冲突,需要手动解决。
git merge:合并分支时冲突。git rebase:变基时冲突。git pull:拉取远程代码时冲突(本质是 git fetch + git merge)。Git 使用三向合并(3-way merge)算法对比文件差异:
如果同一行在 HEAD 和远程版本都被修改,Git 无法自动合并,就会触发冲突。
运行 git status,冲突文件会显示为 Unmerged paths:
$ git status
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/app.js打开冲突文件(如 src/app.js),Git 会用特殊标记标注冲突部分:
<<<<<<< HEAD
console.log("这是本地修改");
=======
console.log("这是远程修改");
>>>>>>> feature-branch<<<<<<< HEAD 到 =======:本地代码======= 到 >>>>>>> feature-branch:远程代码根据需求选择以下一种方式:
console.log("这是本地修改");console.log("这是远程修改");console.log("这是合并后的代码");git add src/app.js # 标记冲突已解决
git commit # 提交合并结果Git 会自动生成合并提交信息,例如:
Merge branch 'feature-branch' into maingit merge --abort # 终止 merge
git rebase --abort # 终止 rebasegit mergetool # 调用配置的差异对比工具git diff 查看冲突差异git diff # 查看未暂存的冲突
git diff --cached # 查看已暂存的冲突git checkout --ours/theirs 快速选择版本git checkout --ours src/app.js # 保留本地版本
git checkout --theirs src/app.js # 保留远程版本git rerere 自动记录冲突解决方案git config --global rerere.enabled true # 开启 rerereGit 会记住冲突解决方式,下次遇到相同冲突自动应用。
git commit -m "描述" 提交小功能点。git pull origin main --rebase # 使用 rebase 代替 merge 减少冲突.gitattributes 定义合并策略(如二进制文件禁止合并)。你在 main 分支修改了 README.md:
# 项目介绍
这是本地修改同事在 feature-branch 修改了同一行并推送:
# 项目介绍
这是远程修改你尝试合并时触发冲突。
git pull origin feature-branch
# 发现冲突,手动修改 README.md
git add README.md
git commit -m "解决 README.md 冲突"
git push origin main关键点 | 说明 |
|---|---|
冲突原因 | 多人修改同一文件同一行 |
解决方案 | 手动编辑 → git add → git commit |
预防措施 | 小步提交、频繁拉取、分支策略 |
掌握 Git 冲突解决,能极大提升团队协作效率。建议多练习 merge 和 rebase,熟悉不同场景下的处理方式。
延伸阅读:
希望这篇指南能帮你彻底搞定 Git 冲突!如果有问题,欢迎留言讨论。 🚀