如何删除Git中的最新提交与指定旧提交?
别担心,我来一步步帮你搞定删除bc8354f和422f6cb这两个提交的操作,同时保留其他提交不受影响。
第一步:确认提交历史范围
首先,先确认这两个提交确实在你要操作的4个提交范围内。执行以下命令查看最近4个提交的简洁历史:
git log --oneline -n 4
你会得到类似这样的输出(顺序是从最新到最旧):
abc1234 最新的提交信息 bc8354f 第三个提交的信息 422f6cb 第二个提交的信息 def5678 第一个提交的信息
这能确保422f6cb和bc8354f都在HEAD~4覆盖的范围内。
第二步:执行交互式变基并标记要删除的提交
重新执行交互式变基命令:
git rebase -i HEAD~4
这时候会打开一个文本编辑器(默认是vim,如果你不习惯可以提前配置其他编辑器),里面的提交列表是从旧到新排列的,也就是最上面的是def5678,然后是422f6cb,接着是bc8354f,最下面是abc1234。
你需要把要删除的提交前面的pick改成d(或者drop,效果一样),修改后的内容大概是这样:
pick def5678 第一个提交的信息 d 422f6cb 第二个提交的信息 d bc8354f 第三个提交的信息 pick abc1234 最新的提交信息
保存并退出编辑器(vim里按Esc,输入:wq回车即可)。
第三步:处理变基冲突(如果有的话)
如果这两个提交和其他提交没有代码冲突,Git会自动完成变基,这时候你执行git log --oneline就能看到那两个提交已经被移除了。
如果出现冲突,Git会暂停变基并提示你解决冲突。解决完冲突后,执行以下命令继续变基:
git add . git rebase --continue
重复这个过程直到变基完成。
第四步:让修改生效到远程仓库(如果已经推送过)
如果这个分支已经推送到远程仓库,因为你修改了Git历史,需要强制推送修改后的分支。为了安全起见,推荐使用--force-with-lease而不是直接--force,它会避免覆盖其他人在远程分支上的新修改:
git push --force-with-lease origin 你的分支名称
关于你之前遇到的问题
你说执行git rebase -i HEAD~4只看到bc8354f,大概率是编辑器里的提交列表是从旧到新排列的,422f6cb在列表的上方,你没注意到。另外,删除提交后如果没看到HEAD变化,可能是变基没完成(比如有冲突没处理),或者你没刷新提交历史,执行git log就能确认修改是否生效了。
内容的提问来源于stack exchange,提问作者user2568374

