Git冲突的本质
Git冲突不是错误,是它发现两个人改了同一行代码、不知道该听谁的时候停下来问你。学会读冲突标记和解决冲突是 Git 协作的必修课。新手最常见的恐惧是:’我合并了冲突提交了,会不会把别人的代码覆盖?’ 学会下面的方法论你会发现:冲突只是日常协作的一部分,根本不可怕。
第一步:理解冲突标记
冲突的文件会出现特殊标记:
<<<<<<< HEAD
main 分支的代码
=======
feature 分支的代码
>>>>>>> feature-branch
- <<<<<<< 到 ======= 之间是你当前分支(HEAD)的代码
- ======= 到 >>>>>>> 之间是要合入分支的代码
你需要决定保留哪些、修改哪些、删除哪些。
第二步:触发一次冲突(练习)
- 创建 test-conflict 文件,里面写入 ‘line A’
- 提交并推送
- 创建分支 feature-X,修改为 ‘line B’
- 切回 main,修改为 ‘line C’,提交推送
- 在 main 执行 git merge feature-X —— 冲突出现
第三步:解决冲突的两种工具
3.1 命令行解决
- 打开冲突文件,手动编辑
- 删除冲突标记
- 保留你想要的代码
- git add 标记为已解决
- git commit 完成合并
3.2 VSCode 解决
VSCode 打开冲突文件会显示彩色合并视图,三栏:
- Incoming——要合入的代码
- Current——当前分支的代码
- Result——最终结果
点击 ‘Accept Current’、’Accept Incoming’、’Accept Both’ 按钮即可。适合不熟悉命令行的同学。
第四步:常见合并场景
4.1 保留两边代码
两个人添加了不同函数,直接保留全部,删除标记即可。
4.2 保留你自己的
另一边的改动是错的或不需保留,点击 ‘Accept Current’。
4.3 保留另一边的
自己的改动没必要,点击 ‘Accept Incoming’。
4.4 手动合并
代码需要重构或合并两边的逻辑,手动写新版本。
第五步:放弃合并
如果冲突太复杂想重来:
git merge –abort
回到合并前的状态。或者用 git reset –hard HEAD 回退。
第六步:rebase 高阶用法
rebase 是把’我的提交’接到’别人最新提交’后面,让历史更线性。但比 merge 复杂:
- git switch feature-x
- git rebase main
- 如果有冲突,编辑文件 + git add
- git rebase –continue 继续
- git rebase –abort 放弃
已推送的分支不要 rebase,会推不动。规则:rebase 自己的本地分支,merge 共享分支。
第七步:交互式rebase(改写历史)
想把最近的 3 个 commit 合并成 1 个?
git rebase -i HEAD~3
弹出编辑器,把后两个改成 ‘squash’,保存。Git 自动合并 commit。适合清理提交历史。
第八步:cherry-pick 选择性合并
另一个分支有个 commit 想要,但不想合并整个分支:
git cherry-pick <commit-hash>
把那个 commit 单独拿过来。可以多次使用挑多个 commit。
第九步:冲突预防
最好的策略是不冲突:
- 频繁拉取——每天早上 git pull 一次最新代码
- 功能分支短——别在分支上开发一周,PR 越小冲突越少
- 模块化——团队成员各负责不同模块文件
- 沟通——同一文件改动前群里说一声
- CI/CD 自动化测试——冲突后跑测试验证
第十步:实战工具
- VSCode 内置 Git 工具——图形化解决冲突
- GitLens 扩展——可视化作者和历史
- GitHub Desktop——适合纯 GUI 用户
- Sublime Merge——专业 Git 客户端,速度极快
- Sourcetree——免费、老牌、功能全面
效率提升
从恐惧冲突到日常处理:
- 冲突平均解决时间从 30 分钟降到 5 分钟
- 用 rebase 保持提交历史线性,code review 友好度提升 50%
- 小批量 PR 比大合并冲突率减少 70%
- 团队每天节省 10 分钟合并时间
核心心法:冲突是协作常态,工具熟练了就能快刀斩乱麻。