git rebase 冲突怎么解决?遇到冲突如何中止与继续
git rebase 把提交变基时也可能冲突。本文讲清 rebase 冲突与 merge 冲突的差别、解决步骤、以及用 rebase --continue / --abort / --skip 处理。
场景:执行 git pull --rebase 或 git rebase 想整理提交,结果停下来提示冲突。和 merge 冲突不同,rebase 会逐个提交重放,可能让你解决多次。掌握三招就能从容应对。
rebase 冲突长什么样
CONFLICT (content): Merge conflict in 文件.js
error: could not apply abc1234... 提交说明
Resolve all conflicts manually, mark them as resolved with "git add", then run "git rebase --continue".
与 merge 冲突不同,rebase 是一个个提交地重放,冲突通常出现在某个具体提交上,需要逐个处理。
解决步骤(核心流程)
# 1. 查看冲突文件
git status
# Unmerged paths: 下列出的就是要解决的
# 2. 打开文件,手动处理 <<<<<<< ======= >>>>>>> 标记
# 保留你想要的代码,删掉标记
# 3. 标记为已解决
git add 文件.js
# 4. 继续 rebase
git rebase --continue
如果 --continue 弹出编辑器让你改提交信息,直接保存退出即可;之后若还有下一个冲突,重复上述步骤。
三个关键命令
| 命令 | 作用 |
|---|---|
git rebase --continue | 冲突解决并 add 后,继续处理下一个 |
git rebase --abort | 完全取消这次 rebase,回到起点(最安全) |
git rebase --skip | 跳过当前这个有冲突的提交(会丢弃它) |
实战:想放弃时就 abort
git rebase --abort
这会把分支完全恢复到 rebase 之前的状态,你原来的所有提交都在,什么都没丢。拿不准时先用它保平安。
完整示例
git checkout feature
git rebase main # 把 feature 的提交重放到 main 之上
# ... 遇到冲突 ...
# 打开冲突文件手动改
git add 文件.js
git rebase --continue # 继续
# 若反复冲突,实在搞不定:
git rebase --abort # 放弃,回原状
rebase vs merge 怎么选
- 想要干净线性的历史、提交条理清晰 → 用 rebase(团队常见于 pull --rebase)
- 想保留完整合并记录、或分支已共享给他人 → 用 merge
记住:已 push 到远程且多人共用的分支,不要随意 rebase,会改写历史导致协作者冲突。
常见问题
- abort 后改动还在吗:在。abort 是回到 rebase 前,你本地的提交和未提交改动都保留。
- 想跳过但保留改动:
--skip会丢当前提交内容,如需保留应先 cherry-pick。
一句话速记
冲突了 → git add 解决文件 → git rebase --continue;搞不定 → git rebase --abort。
?
常见问题 FAQ
git rebase 和 git merge 解决冲突的区别?
两者都要手动改冲突文件,但 merge 产生一个合并提交、历史有分叉;rebase 把你的提交一个个重放到新基点上,历史更线性。rebase 冲突后每个提交都要依次解决,可能解决多次。
rebase 冲突太麻烦,怎么放弃回到原状?
用 git rebase --abort,会完全取消这次 rebase,回到开始前的状态,你原有的提交和改动都保留。
rebase 中途某个提交不想要了能跳过吗?
可以,用 git rebase --skip 跳过当前这个有冲突的提交,继续处理后续。注意它会丢弃当前这个提交。
rebase 和 pull --rebase 有什么关系?
git pull --rebase 本质是 fetch 后对你本地提交做一次 rebase 到远程最新,避免产生 merge 提交,使历史干净。它冲突处理方式与普通 rebase 相同。