You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何撤销合并到主分支的千条压缩提交且不丢失后续修改?

恢复被压缩合并的提交且保留后续修改的方法

1. 先定位关键提交哈希

你需要从提交历史里找出三个关键的哈希值:

  • 压缩合并前主分支的最后一个提交(记为main-before-squash)
  • 那个包含上千条提交的分支的顶端提交(记为feature-branch-top)
  • 压缩合并后的第一个后续提交(记为first-post-squash)

直接用git log --oneline就能快速浏览提交历史,把这几个哈希记下来。

2. 用变基重写提交历史(推荐)

这个方法能一次性把后续提交移到未压缩的提交之后,步骤如下:

  1. 基于未压缩的分支顶端创建临时分支:
git checkout -b temp-recover feature-branch-top
  1. 把主分支上压缩合并后的所有后续提交,重新应用到临时分支上:
git rebase --onto temp-recover main-before-squash main

这个命令的逻辑是:取main分支里从main-before-squash之后的所有提交(也就是你不想丢的后续修改),把它们一个个“搬”到temp-recover分支的末尾。

  1. 过程中如果碰到冲突,先手动修改冲突文件,改完后执行git add <冲突文件名>,再跑git rebase --continue,直到所有冲突处理完。

  2. 完成后,你的main分支就同时包含原来的上千条提交和后续修改了。推送到远程的时候因为改了历史,需要用强制推送,但记得用更安全的--force-with-lease:

git push origin main --force-with-lease

3. 解决Git Blame的问题

用上面的方法重写历史后,每个提交的作者和修改记录都会正确保留,再用git blame <文件名>查看时,就能看到原始的提交信息,不会被之前的压缩提交覆盖。

备选:手动挑选提交(冲突多时用)

如果变基过程冲突太多搞不定,可以逐个把后续提交挑过来:

  1. 切换到未压缩的分支顶端,新建一个恢复分支:
git checkout -b recover-branch feature-branch-top
  1. 用git log --oneline main-before-squash..main列出所有后续提交的哈希,然后逐个执行:
git cherry-pick <提交哈希>
  1. 每个提交冲突处理完后,用git cherry-pick --continue继续,直到所有提交都挑完。

  2. 最后把主分支指向这个恢复分支:

git checkout main
git reset --hard recover-branch
  1. 同样用git push origin main --force-with-lease推送到远程。

内容的提问来源于stack exchange,提问作者Verner Codoceo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:10:48