合并冲突后如何中止这次 merge
中止合并用 git merge --abort,仓库回到合并前的状态,冲突标记与暂存全部丢弃。rebase 对应的命令是 git rebase --abort。中止后可换个思路(换策略/分批合)再来。
git merge --abort 尝试恢复合并前状态;若合并前已有未提交改动,尤其合并后又改过,Git 不保证能重建全部内容。rebase 过程中想退出则用 git rebase --abort。
典型流程
git merge feature-x
# 冲突一堆,先不玩了
git merge --abort
git status # 检查恢复结果,不保证没有原有改动
中止之后再怎么合
中止只是"退出这次尝试",分歧还在。可选策略:
# 1. -X 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"时有效;MERGE_AUTOSTASH 存在时还会尝试恢复自动 stash,可能再次冲突。已完成的快进也没有可中止的 merge。已经 git commit 完成了合并?那就不是中止而是撤销:
# 先备份未提交改动并核实 ORIG_HEAD;它可能已被后续命令更新
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);大重构拆小步走;目录级冲突(如格式化整库)团队约定专门窗口期做。