使用 git rebase 解决 PR 冲突指南
🎯 场景说明
在提交 Pull Request(PR)过程中,如果目标分支(如 main)已被其他团队成员合并了新的更改,你的分支可能会与最新主干代码产生冲突。
此时,推荐使用 git rebase 将你的变更“重新应用”到最新的 main 分支上,以保持提交历史清晰并解决冲突。
✅ 建议:使用代码编辑器(如 VS Code、IntelliJ IDEA、WebStorm 等)处理冲突,可视化界面能更直观地对比差异、选择保留逻辑,大幅提升效率和准确性。
🔁 操作流程:基于 main 基线执行 rebase
步骤 1:更新本地 main 分支
确保本地的 main 分支是最新状态:
# 切换到 main 分支
git checkout main
# 拉取远程最新代码
git pull origin main
步骤 2:切换回你的功能分支并执行 rebase
# 切换到你的功能分支
git checkout feature/user-profile
# 基于最新的 main 执行变基
git rebase main
示例输出(存在冲突):
Auto-merging src/app/models/user.go
CONFLICT (content): Merge conflict in src/app/models/user.go
Auto-merging web/src/views/Profile.vue
CONFLICT (content): Merge conflict in web/src/views/Profile.vue
error: could not apply def456e... feat(profile): add avatar upload
hint: Resolve conflicts manually, then run "git add <file>" followed by "git rebase --continue".
hint: To abort and restore the original branch, run "git rebase --abort".
Could not apply def456e... feat(profile): add avatar upload
⚠️ 此时 Git 暂停 rebase,等待你解决冲突。
步骤 3:在代码编辑器中解决冲突(推荐方式)
✅ 推荐工具:
- VS Code:内置 Git 冲突合并器
- IntelliJ IDEA / WebStorm / GoLand:图形化合并工具
- Vim / Emacs:高级用户可用
vimdiff
🔍 操作步骤(以 VS Code 为例):
- 打开提示中列出的冲突文件(如
user.go、Profile.vue)。 - 编辑器会高亮显示冲突区域,格式如下:
<<<<<<< HEAD
func SaveUser(name string) { /* 当前 main 的逻辑 */ }
=======
func SaveUser(name, email string) { /* 你新增的参数 */ }
>>>>>>> def456e... feat(profile): add avatar upload
- 在编辑器中点击 Accept Current Change、Accept Incoming Change 或 Accept Both Changes,或手动编辑保留所需逻辑。
- 保存文件。
💡 优势:
- 可视化对比“当前版本”(main)与“传入版本”(你的更改)
- 一键选择保留哪一部分,避免手动删除标记出错
- 支持预览合并结果,减少误操作
步骤 4:标记冲突已解决并继续 rebase
对每个已解决的文件执行:
git add src/app/models/user.go
git add web/src/views/Profile.vue
然后继续 rebase:
git rebase --continue
📝 系统会恢复你原来的提交信息,确认无误后保存即可。
步骤 5:强制推送更新到远程分支
rebase 完成后,提交历史已被重写,需强制推送到远程:
git push -f
✅ 此操作会自动更新你的 PR,使其基于最新
master,冲突消失。
🛑 紧急情况:放弃 rebase
如果你在处理过程中想回到初始状态:
git rebase --abort
执行后,分支将恢复到 rebase 开始前的状态,一切如初。
💡 最佳实践建议
| 建议 | 说明 |
|---|---|
| ✅ 使用 IDE 处理冲突 | 图形化工具更安全、高效,尤其适合复杂文件 |
✅ 定期同步 main | 减少后期冲突数量和复杂度 |
| ✅ 提交粒度小 | 小而清晰的提交更容易 rebase 和审查 |
| ✅ 避免对公共分支 rebase | 仅对自己分支操作,避免影响他人 |
📚 总结
| 操作 | 命令 |
|---|---|
| 更新主干 | git checkout main && git pull origin main |
| 执行 rebase | git rebase main |
| 解决冲突后继续 | git add <file> && git rebase --continue |
| 放弃 rebase | git rebase --abort |
| 推送更新 | git push -f origin your-branch |
✅ 强烈建议:在代码编辑器中解决冲突,利用其可视化对比功能,快速、准确地完成合并,避免文本标记遗漏或逻辑错误。