如何通过命令行移除Git仓库指定空提交且不影响其他提交
可行解决方案
你开发的CLI工具可以直接使用以下两种非交互式方案实现指定空提交删除,不会影响其他空提交,也无需人工交互:
方案1:cherry-pick 跳过指定提交(最稳定,适配合并场景)
你在创建待删空提交时可以提前记录此时的分支HEAD(也就是你说的第一个合并提交,记为C1),后续删除空提交(记为C2)时执行以下步骤即可:
- 记录当前分支最新提交ID:
CURRENT_HEAD=$(git rev-parse HEAD) - 将分支硬重置到C1的位置:
git reset --hard <C1的提交ID> - 把C2之后的所有提交迁移过来:
git cherry-pick <C2的提交ID>..$CURRENT_HEAD
如果C2之后存在合并提交,执行cherry-pick时追加
-m 1参数指定使用第一个父节点即可。
方案2:修正参数后的rebase实现
你之前的rebase命令缺少了待重基的目标引用参数,且不需要用^回溯父提交(直接用你提前记录的C1 ID即可避免emptyCommitID^无效的问题),正确命令如下:git rebase --onto <C1的提交ID> <C2的提交ID> HEAD
若需要保留提交历史中的合并结构,追加
-r参数即可。
历史报错原因说明
- 执行
git rebase --onto emptyCommitID^ emptyCommitID报错:一是缺少最后一个待重基的目标引用参数,二是如果你在Windows环境执行,^是系统默认转义符,会被系统吞掉导致解析失败,直接使用你创建空提交时记录的父提交ID即可规避该问题。 - 同时传入
--keep-base和--onto参数报错:Git本身不允许这两个参数同时使用,属于非法参数组合。 - 执行
rebase -i HEAD~3报错:因为你的历史存在合并不相关历史的提交,HEAD~n是沿着提交的第一个父节点线性回溯,当历史路径存在分叉或者当前分支提交总数不足时,就会出现上游无效的错误。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

