如何将本地分支中选定的旧提交C-E压缩为单个提交C'
操作方案:交互式变基(推荐,步骤简洁直接)
假设你的本地提交链从旧到新为:公共历史 → E → ... → C → B → A(当前HEAD,本地dev分支),目标是将E到C的所有提交压缩为单个提交C',最终得到**公共历史 → C' → B → A(HEAD)**的提交结构,且不改动远程origin分支。
- 确保当前处于本地
dev分支:git checkout dev - 执行交互式变基,指定变基起点为C的父提交(即E的直接父,也就是公共历史的最后一个提交)。
- 若你不知道该提交的哈希,可通过相对位置指定:假设从A往回数,E是第N个提交(比如A是HEAD,B是HEAD1,C是HEAD2,E是HEAD~4,那N=4),则命令为:
git rebase -i HEAD~N - 若你能找到公共历史最后一个提交的哈希(比如
abc123),直接用:git rebase -i abc123
- 若你不知道该提交的哈希,可通过相对位置指定:假设从A往回数,E是第N个提交(比如A是HEAD,B是HEAD1,C是HEAD2,E是HEAD~4,那N=4),则命令为:
- 在弹出的编辑器中,会列出从E到A的所有提交,格式类似:
pick e12345 提交E的信息 pick f67890 提交X的信息(E和C之间的提交) pick g01234 提交C的信息 pick h56789 提交B的信息 pick i01234 提交A的信息 - 修改提交指令:保留E的
pick,将E之后到C的所有提交的pick改为squash(或fixup,后者会丢弃被压缩提交的信息,仅保留E的提交信息),B和A的pick保持不变:pick e12345 提交E的信息 squash f67890 提交X的信息 squash g01234 提交C的信息 pick h56789 提交B的信息 pick i01234 提交A的信息 - 保存并退出编辑器,Git会自动将E到C的提交压缩为一个新提交。随后会弹出新的编辑器,让你修改合并后的提交信息,将其改为C'的描述,保存退出即可。
完成后,本地dev分支的提交链就变为目标结构,HEAD仍指向A,全程不会改动远程origin分支。
额外提示
- 若操作中出错,可随时执行
git rebase --abort撤回变基,回到操作前的状态。 - 该操作仅修改本地未推送的提交,不会影响远程仓库,无需担心对他人工作造成干扰。
内容的提问来源于stack exchange,提问作者Bo Beep
相关产品推荐
相关产品推荐

