合并冲突后如何中止这次 merge
中止合并用 git merge --abort,仓库回到合并前的状态,冲突标记与暂存全部丢弃。rebase 对应的命令是 git rebase --abort。中止后可换个思路(换策略/分批合)再来。
git merge --abort 一条命令回到合并前的状态:冲突标记清除、暂存区还原、分支指针不动,就像这次 merge 没发生过。rebase 过程中想退出则用 git rebase --abort。
典型流程
git merge feature-x
# 冲突一堆,先不玩了
git merge --abort
git status # 确认干净
中止之后再怎么合
中止只是"退出这次尝试",分歧还在。可选策略:
# 1. 用 ours/theirs 策略整体偏向一边
git merge -X theirs feature-x # 冲突处采用对方的改动
# 2. 先 rebase 自己再合,减少冲突面
git rebase main # 在 feature 分支上执行
# 3. 改用图形化工具处理大冲突
git merge feature-x
git mergetool # 调起 vimdiff/VS Code 等
如果 --abort 报错
git merge --abort 仅在"正在进行 merge"时有效。已经 git commit 完成了合并?那就不是中止而是撤销:
git reset --hard ORIG_HEAD # 回到合并前的提交(合并刚完成时)
# 已推送的合并用 revert
git revert -m 1 <合并提交哈希>
常见问题(FAQ)
Q:--abort 会丢我合并前的工作区改动吗?
merge 开始前 Git 就要求工作区基本干净(有冲突风险的未提交改动会直接拒绝 merge)。--abort 只还原 merge 产生的变化。但养成 merge 前 commit 或 stash 的习惯总是更安全。
Q:cherry-pick / revert 冲突了怎么中止?
对应的 git cherry-pick --abort、git revert --abort,语义相同。
Q:怎么避免每次都大面积冲突?
分支生命周期别拉太长,勤做同步(定期 merge/rebase main);大重构拆小步走;目录级冲突(如格式化整库)团队约定专门窗口期做。