如何撤销合并到主分支的千条压缩提交且不丢失后续修改?
恢复被压缩合并的提交且保留后续修改的方法
1. 先定位关键提交哈希
你需要从提交历史里找出三个关键的哈希值:
- 压缩合并前主分支的最后一个提交(记为
main-before-squash) - 那个包含上千条提交的分支的顶端提交(记为
feature-branch-top) - 压缩合并后的第一个后续提交(记为
first-post-squash)
直接用git log --oneline就能快速浏览提交历史,把这几个哈希记下来。
2. 用变基重写提交历史(推荐)
这个方法能一次性把后续提交移到未压缩的提交之后,步骤如下:
- 基于未压缩的分支顶端创建临时分支:
git checkout -b temp-recover feature-branch-top
- 把主分支上压缩合并后的所有后续提交,重新应用到临时分支上:
git rebase --onto temp-recover main-before-squash main
这个命令的逻辑是:取
main分支里从main-before-squash之后的所有提交(也就是你不想丢的后续修改),把它们一个个“搬”到temp-recover分支的末尾。
过程中如果碰到冲突,先手动修改冲突文件,改完后执行
git add <冲突文件名>,再跑git rebase --continue,直到所有冲突处理完。完成后,你的
main分支就同时包含原来的上千条提交和后续修改了。推送到远程的时候因为改了历史,需要用强制推送,但记得用更安全的--force-with-lease:
git push origin main --force-with-lease
3. 解决Git Blame的问题
用上面的方法重写历史后,每个提交的作者和修改记录都会正确保留,再用git blame <文件名>查看时,就能看到原始的提交信息,不会被之前的压缩提交覆盖。
备选:手动挑选提交(冲突多时用)
如果变基过程冲突太多搞不定,可以逐个把后续提交挑过来:
- 切换到未压缩的分支顶端,新建一个恢复分支:
git checkout -b recover-branch feature-branch-top
- 用
git log --oneline main-before-squash..main列出所有后续提交的哈希,然后逐个执行:
git cherry-pick <提交哈希>
每个提交冲突处理完后,用
git cherry-pick --continue继续,直到所有提交都挑完。最后把主分支指向这个恢复分支:
git checkout main git reset --hard recover-branch
- 同样用
git push origin main --force-with-lease推送到远程。
内容的提问来源于stack exchange,提问作者Verner Codoceo
相关产品推荐
相关产品推荐

