开发者说丨Git删除本地任意提交记录的方法

Git是一款免费、开源的分布式版本控制系统,可以敏捷高效地处理任何或小或大的项目。

 

在项目实际开发过程中,可能由于疏忽,上传了一些敏感信息,例如测试的账户名与密码,但是后续的工作需要将项目公开,为了避免信息泄露,那么必须清除Git的提交历史记录。

 

本文由社区荣誉布道师——贺志国撰写Git删除本地任意提交记录的方法进行了详细讲解,希望这篇文章能给感兴趣的开发者带来更多帮助。

 

以下,ENJOY  

 

使用git管理代码版本时,有时需要删除一些本地错误提交的记录,如果待删除记录是最后一条或N条记录,操作很简单,使用如下命令即可:

 

1# 删除本地最后一条记录,如果需要删除最后提交的N条记录,将“1”替换为一个具体的数字“N”即可。
2git reset --hard HEAD~1

 

但生活往往不会太过于简单,有时我们会需要删除提交记录中的某几条,例如,使用git log命令(小提示:可以使用git log --oneline查看精简的提交记录)查看得到的提交记录如下:

 

 

提示

 1# 显示每次修改的文件列表及修改状态
 2git log --name-status 
 3# 显示每次修改的文件列表
 4git log --name-only 
 5# 显示每次修改的文件列表及文件修改的统计
 6git log --stat 
 7# 显示每次修改的文件列表
 8git whatchanged 
 9# 显示每次修改的文件列表及统计信息
10git whatchanged --stat
11# 显示最后一次的文件改变的具体内容
12git show 

 

需要删除图中用蓝色框标注的两条记录,这时该怎么办呢?

 

首先找到最后一条待删除记录的前一条记录ID,a8547a8beb2a11efc80a0594ebb2da21ced10439(实际处理时没必要写这么长,只写前面几位a8547即可,具体需要的长度无法指定,确定原则就是确保记录ID能唯一标识),接下来执行如下命令:

 

1git rebase -i a8547

 

会进入如下界面:

 

 

注意:1. 界面中的提交记录是以堆栈显示的,本地最后一条提交记录显示在最下方,最后一条待删除记录显示在最上方;2. 界面是以vi打开的,编辑方法与vi命令相同。

 

根据前图中的蓝框标记,待删除记录的ID分别为3dd131a、ec4a612。使用j、k上下移动到pick 3dd131a与pick ec4a612,再使用cw命令将行首的pick替换为drop注意每完成一个替换操作,需要按下Esc键退出vi的编辑模式)。检查确认后,按wq保存并退出,接下来就等待git为我们删除上述两条选中的提交记录,顺利完成后的提示如下所示:

 

 

可以使用git log命令检查确认上述两条记录已被删除:

 

 

当然,也有可能会出现无法删除某条记录的情况,例如,删除记录2f18f01就会出现如下错误:

 

 

解决方法当然就是按照提示,要么人工解决冲突后,使用git rebase --continue继续变基,要么就是使用git rebase --skip忽略问题(强烈不建议,因为极有可能无法变基成功,即使成功也会出现很大的隐患),要么使用git rebase --abort终止变基。

 

题外话

 

git rebase -i命令还可以用来调整本地提交记录的顺序,方法很简单,在如下界面中使用vi的操作命令修改提交记录的顺序,按wq保存退出即可: