首页 > 其他分享 >Git使用经验总结6-删除远端历史记录

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

时间:2024-09-06 19:15:03浏览次数:11  
标签:历史记录 git 删除 -- rebase Git 提交 经验总结

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

  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,删除,--,rebase,Git,提交,经验总结
From: https://www.cnblogs.com/charlee44/p/18400841

相关文章

  • git如何回滚代码
     方法一:使用gitreset命令命令可以将当前分支的HEAD指针指向指定的提交,从而回退代码到指定版本。该命令有三种模式:–soft、–mixed和--hard。它们的区别在于回退代码的程度不同。--mixed(默认):将HEAD指针和暂存区都回退到指定提交,但不改变工作区的内容。--soft......
  • 如何将源码压缩后发布到 GitHub 或其他平台
    在软件开发过程中,源码的管理和发布是非常关键的环节。特别是在需要对源码进行共享、分发或归档时,压缩和上传源码到平台如GitHub、GitLab、或其他云存储服务上是常见的做法。为什么需要压缩源码在一些场景下,开发者可能需要将源码进行压缩后发布,例如:1.文件体积较大:项目文件......
  • git 管理
    安装sudoapt-getinstallgit当前环境为Linuxgitinit初始化git仓库(Ctrl+H显示隐藏文件夹)gitconfiguser.namexxxgitconfiguser.emailxxx.com4.touch文件,新建文件5.gitstatus查看当前git工作状态6.gitaddxx将工作区域的文件,增加到缓存区7.git......
  • git 推送本地文件
    引言参考文章:Git操作全流程介绍Git的工作流程如下所示:1.创建仓库1.1新建gitee仓库在gitee中创建一个仓库HelloWorld,如下所示:1.2初始化本地仓库假设本机有一个MyCode文件夹,进入该文件夹目录下,在该处打开gitbash。,输入命令将该文件夹初始化为git仓库:len......
  • idea安装git commit comment plugin增强git提交注释规范
    一、安装插件打开idea的设置界面并找到插件二、重启idea并打开gitcommittemplate三、打开提交弹窗,可以选择gitcomment的类型说明安装成功......
  • git 提交代码命令
    git命令gitaddfiles添加修改的文件到暂存区gitcommit-m"备注"   提交代码gitpull拉取他人代码(防止代码提交上去之后把别人的代码覆盖了)如果与他人的代码有冲突了解决冲突,保留需要的代码再提交gitpush将代码推送origin上gitbranch  XXX  创建XXX分......
  • 【git】No user exists for uid 1000 fatal: 无法读取远程仓库。
    一、问题   今天拉取代码时,突然报错  二、处理过程1、检查用户信息$id-u1000用户的id是对的那是因为什么呢 2、重启终端发现还是不行 3、重启电脑发现还是不行 三、解决方案最终重新生效环境变量$source~/.bashrc 然后重新执行拉取更新$gitf......
  • git diff 命令浅析
    gitdiff命令浅析以下内容来自GPT的chat请向我介绍gitdiff命令的用法gitdiff是Git中用于比较不同版本之间的改动的一个非常重要的命令。它可以比较工作区、暂存区和提交历史中的差异,帮助开发者理解和查看代码的变化情况。gitdiff的基本用法比较工作区和暂存区:当你......
  • 在keil中使用git
    目录搜集官方相关帮助1.applicationnote2.软件附带帮助文件基础准备git命令行MDK版本操作步骤1.Abstract(摘要)2.Introduction3.Workflows3.1.CentralizedWorkflow4.UsingGitwithµVision4.1.ProjectFilesunderVersionControl4.2.Filesthatdonotneedtobemonitored......
  • 如何将 SSH Key 添加到极狐GitLab 中?
    本文分享如何生成SSHKey并添加到极狐GitLab中,然后用SSHKey进行代码拉取。SSHKey对于通过ssh来进行极狐GitLab代码拉取是重要的,完成整个流程一般分为三步:SSHKey的生成添加SSHKey到极狐GitLab中使用ssh克隆代码第一步:生成SSHKey使用ssh-keygen命令来生成SSH......