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

  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

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

Git使用经验总结6-删除远端历史记录的更多相关文章

  1. git推送本地分支到远端 以及删除远端分支的 命令

    git推送本地分支到远端 当前处于master分支,尝试用了git push origin warning: push.default is unset; its implicit value is ...

  2. git如何删除远端不存在的本地分支?

    问题:远端分支删除后,如何删除之前拉取的本地分支? 答案: git fetch -p git remote show origin 可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息 ...

  3. 如何删除远端已经推送的Commit记录???(Git版本回退)

    如何删除远端已经推送的Commit记录???(Git版本回退) 简单描述 突然事件:刚刚,就在刚刚,发生误了操作. 操作描述:我把修改的文件保存错分支了,已经commit了.并且还push上去了.对, ...

  4. [Tips] Git使用经验

    brach 查看目前branch git branch 显示结果: * master *表示这是当前的branch. 建立分支 git branch 分支名 删除分支 git branch -d 分支 ...

  5. git使用经验for windows

    一.本地同步fork的最新版本 二.git命令 一.本地同步fork的最新版本 ①打开Git CMD工具,进入git的主目录 ②使用 git remote -v 查看fork的远程仓库地址 origi ...

  6. git 入门教程之删除文件

    删除文件 回忆一下文件的常见操作,新增文件,修改文件,删除文件等,新增和修改文件都单独讨论过,现在我们来研究一下如何删除文件. 你可能会说删除文件还不简单啊,直接 rm -rf <file> ...

  7. git推送tag到远端服务器

    git推送tag到远端服务器 默认情况下,git push并不会把tag标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库.1.push单个tag,命令格式为:git push origi ...

  8. Git 推送和删除远程标签

    事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs: git push origin 标签名 相当于 git push origin refs/tags/源标签名 ...

  9. git 常用命令(含删除文件)

    git 常用命令(含删除文件) Git常用操作命令收集: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库: ...

  10. Git 推送和删除标签

    事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs:git push origin 标签名相当于git push origin refs/tags/源标签名:re ...

随机推荐

  1. 深耕分析型数据库领域,火山引擎ByteHouse入围《2024爱分析数据库厂商全景报告》

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 近日,爱分析发布<2024爱分析·数据库厂商全景报告>,报告中爱分析将数据市场从上至下划分为数据库服 ...

  2. 树莓派4B-高精度驱动步进电机

    树莓派4B-高精度驱动步进电机 项目介绍 利用4B树莓派控制步进电机转动,精度可达:0.0144度 (即360度/25000) 适用于非常精密的角度转动. 舵机的精度为1度,无法实现超高精度控制. 硬 ...

  3. JVM是如何创建一个对象的?

    哈喽,大家好,我是世杰. 本文我为大家介绍面试官经常考察的「Java对象创建流程」 照例在开头留一些面试考察内容~~ 面试连环call Java对象创建的流程是什么样? JVM执行new关键字时都有哪 ...

  4. Windows系统下DoH配置小记

    Windows系统下DoH配置小记 浏览器 Edge 打开edge://settings/privacy 使用安全的 DNS 指定如何查找网站的网络地址 设置自定义服务商为https://doh.op ...

  5. mysql order by 造成语句 执行计划中Using filesort,Using temporary相关语句的优化解决

    mysql> explain  select permission.* from t_rbac_permission   permission  inner JOIN  t_rbac_acl   ...

  6. [oeasy]教您玩转python - 0006 - 自由软件运动和开源运动

    ​ 顺序执行 回忆上次内容 上次写了10000行代码 10000行代码 都是写在明面上的 人家一下载​​py​​ 文件 就能看个明明白白 修改或者运行程序都很方便 这程序全都这么公开出来 大家随意修改 ...

  7. python selenium 判断元素是否存在,实现:找到元素,执行对应的代码;找不到元素,继续执行其他代码

    selenium因为找不到元素会抛出异常,导致执行结束 可以考虑使用driver.find_elements(),找不到元素时就会返回空列表,使用if-else语句,判断列表是否为空,非空,则正常找到 ...

  8. 初读nginx.conf

    学成在线里教的部署门户,记录一下NGINX的部分配置是如何使用的 location块用于定义如何处理不同URL请求 1.代理: server { listen 80; server_name file ...

  9. IP地址的精细化操作(将IP地址转为相对应的地址)

    第一步: 导入maven依赖: <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2 ...

  10. 【JDBC】Extra03 PostgreSQL-JDBC

    PostgreSQL的JDBC实现: <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --> <d ...