Git变基异常:如何保留HEAD并删除指定区间提交?
问题描述
之前搞砸git rebase -i操作后,通过git checkout main+git merge detached-branch手动解决冲突,最终得到完全符合预期的提交55c602ed1c(HEAD -> main)。但后续执行git rebase -i时出现异常:
- 调用
git rebase -i 6c3fa102c2时,编辑器显示内容与预期不符,退出后出现冲突; - 执行
git rebase --abort恢复状态后,仍无法正常变基; - 通过
git log --oneline --graph可见提交存在分叉,尝试基于共同祖先32b67d2a01变基时,编辑器列表中未出现55c602ed1c和32b67d2a01;使用32b67d2a01~变基仍不包含55c602ed1c,执行变基会忽略该提交并要求重新解决冲突。
需求:删除HEAD(55c602ed1c)与共同祖先之间的提交,同时保留HEAD提交的内容。
解决方案
方法一:软重置+复用原提交信息
- 确认当前处于
main分支且工作区无未提交修改:git checkout main git status - 软重置分支到共同祖先
32b67d2a01,此时55c602ed1c的内容会保留在工作区和暂存区:git reset --soft 32b67d2a01 - 复用原提交的信息(作者、时间、提交说明)生成新提交:
若需要修改提交信息,直接执行git commit -C 55c602ed1cgit commit即可。
方法二:硬重置+Cherry-pick目标提交
- (可选)备份当前
main分支,防止操作失误:git branch main-backup - 硬重置分支到共同祖先
32b67d2a01:git reset --hard 32b67d2a01 - 将目标提交
55c602ed1c的内容应用到当前分支:
由于git cherry-pick 55c602ed1c55c602ed1c是合并提交,若需要保留合并上下文,可添加-m 1参数(指定以第一个父提交为基准):git cherry-pick -m 1 55c602ed1c
内容的提问来源于stack exchange,提问作者Craig Hicks
相关产品推荐
相关产品推荐

