当前位置: 首页 > news >正文

Git使用经验总结6-删除远端历史记录

删除远端的历史记录但是不影响最新的仓库内容是笔者一直想实现的功能,有两个很不错的用处:

  1. 有的历史提交不慎包含了比较敏感的信息,提交的时候没注意,过了一段时间才发现。这个时候已经有了很多新的历史提交,无法再回退了。
  2. 有时候会拿Git仓库存储代码文件以外的内容,比如美术资源、依赖库等等。这时除了少数提交大部分历史提交是没意义的,还很占仓库空间。

不过要说明的是Git删除历史记录跟我们想象中的不太一样,需要使用的是rebase(变基)功能。这个功能对仓库的改变还挺大的,以防外一我们还是先备份,然后创建一个分支:

git checkout -b cleanup-history

使用变基指令,重写提交历史,如下所示。

git rebase -i HEAD~n

-i表示交互式重写,会弹出一个包含所以历史提交记录的页面让你进行编辑。这里的n表示往前回溯n个版本。例如先检查一下所有的历史提交:

git rev-list --count HEAD

如果得到的数值是500,那么将n设置成499就可以看到所有的历史记录。有时候这个数值不对,可能是因为包含了合并的提交,那么可以试一下:

git rev-list --first-parent --count HEAD

或者:

git rev-list --count --no-merges HEAD

来大概估一下n的数值。当然如果你回溯的历史提交不太远,给个大概能看到你要删除的历史提交即可。

git rebase -i HEAD~n之后在交互式页面中,将需要删除的历史提交记录的操作从pick改为drop。保存并退出编辑器,Git会开始重写历史,删除指定的提交。有时候你想删除的历史提交太多,一个一个改成drop很麻烦,可以使用NotePad3这样的文本工具,通过列选取功能来批量修改。

如果你删除的历史记录足够远足够多,接下来你就会看到比较揪心的一幕,你的Git代码仓库会回溯到最远的历史状态,然后逐步开始自动提交,这个过程很可能会出现一些问题。例如检测到空提交,会提示并中止变基过程,可以进行跳过:

git rebase --skip

还可能会遇到冲突的问题,让你解决冲突。如果是文件文件,就编辑后再git add xxx;如果是二进制文件,要么删除git rm xxx,要么直接git add xxx冲突的文件,然后继续变基:

git rebase --continue

接下来如果一路顺利,就将改动强制推送到远程分支:

git push origin cleanup-history --force

最后,检查一下分支的历史提交内容,没有问题的话将这个分支替换为主分支:

git checkout main
git reset --hard cleanup-history
git push origin main --force

如果想彻底清除这些提交记录,并压缩Git仓库的体积,所以可以使用了如下指令:

git reflog expire --expire=now --all
git gc --prune=now --aggressive

对于其他用户,可以使用如下指令进行更新:

git pull -rebase origin main

在笔者实际的使用过程中,遇到的冲突问题非常多,经常要停下来解决冲突的问题。笔者也不太理解为什么删除历史记录还要解决与当前仓库快照冲突的问题,猜测可能因为笔者的历史提交记录包含了很多合并的提交。因此这个方法对有的读者可能不太适用,可能合并历史提交、或者只保留最新提交的版本更合理一点。

http://www.lryc.cn/news/431824.html

相关文章:

  • Linux 下查找运行中的 Java 进程及 .jar 文件位置
  • Openwrt 安装 AX210 无线网卡
  • 在VitePress中进行页面链接:最佳实践与实例
  • Qt/C++百度地图/高德地图/天地图/腾讯地图/谷歌地图/加载绘图工具栏
  • Vue2 与 Vue3 的区别有哪些
  • 加锁造成的线程优先级反转
  • 【日常记录-Java】SpringBoot中使用无返回值的异步方法
  • 【深度学习】多层感知机的从零开始实现与简洁实现
  • 4、Django Admin对自定义的计算字段进行排序
  • rsync搭建全网备份
  • 网络安全售前入门09安全服务——安全加固服务
  • 【Android】GreenDao数据库的使用方式
  • 搜索算法之线性搜索详细解读(附带Java代码解读)
  • Quartz.Net_依赖注入
  • 【系统架构设计师-2011年】综合知识-答案及详解
  • World of Warcraft [CLASSIC][80][Grandel]Sapphire Hive Drone
  • Unity 对接 Android 第三方广告,App 切换到后台后,再次打开时,第三方广告被销毁导致无法触发回调逻辑的问题
  • Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求
  • 相关二叉树进阶面试题的讲解?看这一篇足矣
  • Nginx部署前端Vue项目的深度解析
  • PHP一站式解决方案高级房产系统小程序源码
  • 轻量级模型解读——EfficientNet系列
  • 深入浅出SRS—RTMP实现
  • 睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩
  • 【Cesium实体创建】
  • 为何一些包的Priority在apt-cache和deb文件当中的不一样
  • CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)
  • nvidia-cuda-tensorrt-cudnn下载网站
  • GitLab 是什么?GitLab使用常见问题解答
  • 数字时代,寻找新的生意增长点之前要做什么准备?