删除远端的历史记录但是不影响最新的仓库内容是笔者一直想实现的功能,有两个很不错的用处:
- 有的历史提交不慎包含了比较敏感的信息,提交的时候没注意,过了一段时间才发现。这个时候已经有了很多新的历史提交,无法再回退了。
- 有时候会拿Git仓库存储代码文件以外的内容,比如美术资源、依赖库等等。这时除了少数提交大部分历史提交是没意义的,还很占仓库空间。
不过要说明的是Git删除历史记录跟我们想象中的不太一样,需要使用的是rebase(变基)功能。这个功能对仓库的改变还挺大的,以防外一我们还是先备份,然后创建一个分支:
使用变基指令,重写提交历史,如下所示。
表示交互式重写,会弹出一个包含所以历史提交记录的页面让你进行编辑。这里的n表示往前回溯n个版本。例如先检查一下所有的历史提交:
如果得到的数值是500,那么将n设置成499就可以看到所有的历史记录。有时候这个数值不对,可能是因为包含了合并的提交,那么可以试一下:
或者:
来大概估一下n的数值。当然如果你回溯的历史提交不太远,给个大概能看到你要删除的历史提交即可。
在之后在交互式页面中,将需要删除的历史提交记录的操作从pick改为drop。保存并退出编辑器,Git会开始重写历史,删除指定的提交。有时候你想删除的历史提交太多,一个一个改成drop很麻烦,可以使用NotePad3这样的文本工具,通过列选取功能来批量修改。
如果你删除的历史记录足够远足够多,接下来你就会看到比较揪心的一幕,你的Git代码仓库会回溯到最远的历史状态,然后逐步开始自动提交,这个过程很可能会出现一些问题。例如检测到空提交,会提示并中止变基过程,可以进行跳过:
还可能会遇到冲突的问题,让你解决冲突。如果是文件文件,就编辑后再;如果是二进制文件,要么删除,要么直接冲突的文件,然后继续变基:
接下来如果一路顺利,就将改动强制推送到远程分支:
最后,检查一下分支的历史提交内容,没有问题的话将这个分支替换为主分支:
如果想彻底清除这些提交记录,并压缩Git仓库的体积,所以可以使用了如下指令:
对于其他用户,可以使用如下指令进行更新: