闲话git reset和git revert

在最近一次面试中,面试官问到了如何删除git中某次指定的提交,由于自己之前都没这个问题的使用场景,有时候发现commit信息有误后也是直接使用--amend参数进行纠正的,所以当时对这个问题回答得并不好。今天查了一些资料,也算对此有了一些认识。

先说说git revert,因为我觉得它比较好讲清楚。git revert的作用是撤销某次commit,它的实现方式是用一次新的commit来回滚之前的commit,也就是说我们在使用git revert commit_id之后,在commit_id和当前head之间的所有commit都还在。

再说说git reset,它的作用是删除某次commit及其之后的所有commit信息,一共有三个参数

  • --mixed: 默认参数,它回退到某个版本,只保留源码,回退commit和index信息,换句话说,就是会回退commit,然后该commit之后所有的改动会保存在工作区间,可以通过git addgit commit配合进行提交
  • --soft: 回退到某个版本,只回退了commit的信息,换句话说,就是回退commit,然后该commit之后所有的改动会存放在stage暂存区,我们可以直接进行git commit提交
  • --hard: 彻底回退到某个版本,本地的源码也会变为上一个版本的内容

使用git reset的方式进行回退可能减小commit的次数,使用git log是看不到被回退的commit的历史的。但是这种方式并不能完全删除敏感信息,我们依然可以通过git reflog查看到git reset删除的commit


经过网友提醒,发现git rebase -i也可以实现撤销某个commit的功能,具体用法可以参考Git重写历史