96编辑器旗下产品
找图
终身
ID:0
到期时间:永久
退出登录
您的位置:首页 > 百科管理 > 详情

git 压缩算法-git 压缩commit

原创:找图网 2023-05-03 20:46:52
  • git rebase 压缩提交

  • 1、在开发分支用rebase对多个commit进行压缩

    执行命令:git rebase -i HEAD~4

    命令后面的数字为需要压缩的commit数量,顺序为倒序

    在弹出的vim编辑页面中,将要压缩的分支前的pick修改为squash,保留一个分支(一般为最上面的分支,即时间最早的分支)

    继续执行保存,可在第二个弹出的vim编辑页面中,将第一个分支的commit描述重新修改一下,作为压缩后新commit的描述

    2、然后将产生的新分支通过cherry-pick合并到主分支

    先切换到主分支master

    执行命令:git cherry-pick <commit编码>

    可将压缩后的该分支合并到主分支,此时主分支将只有这一个合并过来的分支,包含开发中提交的所有commit

    Ps:笔记版本,没有详细整理。

    © 此情可待成追忆,只是当时已惘然。

    自己采坑,自己整理,大家受益。

    欢迎交流,交朋友。tel:502087539(微Q同步)

    对您有帮助就留个言吧,万分感谢~~~

  • git 压缩commit

  • git rebase --interactive HEAD~[N] 命令的缺点就是你必须一个一个的数出准确的提交次数。幸运的是这里还有另一种方式:

    [commit-hash] 就是你要压缩的提交范围的起始提交之前的一次提交的 hash。所以在我的示例中的命令就是:

    6394dc 是 Feature Y。你可以将这个命令理解为:

    对 [commit-hash] 之上的所有提交进行合并。

    这时你的编辑器会有弹窗,显示出你想要合并的提交列表。注意,一开始可能会感觉有点看不明白,因为是按反序排列的,旧的提交显示在顶部。我通过 --- older commit 和 --- newer commit 进行了说明,在编辑器的窗口中不会显示说明。

    在提交列表的底部有一个简短的注释(示例中忽略了),提示了所有的操作选项。你可以在交互式 rebase 中进行各种操作,我们现在只进行一些基本的操作。我们的任务是将所有的提交注释为  squashable ,除了第一个(最早的)提交:它将被用作起始点。

    你可以通过将任务 pick 修改为 squash (或者简写为 s ,评论中有提示)来将提交标记为 squashable 。最后的结果就是:

    你刚刚告诉了 Git 将全部的 7 次提交合并到列表的第一个提交中。现在要给它添加注释:你的编辑器会再次弹出一个带有默认消息的窗口,内容是压缩的所有提交的注释。

    你可以保留默认的提交注释,这样最终的提交信息将会是这些临时提交的注释列表,如下所示:

    通常我不喜欢保留这些信息,所以我会清楚默认消息,使用一些自定义注释,例如 Implemented feature Z。

  • Git工作原理

  • 按照官方文档的描述,Git是这样定义的

    .git目录是Git的核心,每一个变动都会存储在.git文件夹中,Git的相关命令本质上也是读取.git文件夹下的内容

    .git目录下有几个重要的文件/文件夹

    提交和文件是Git中的主要组成,也叫git对象,Git中的许多命令都和git对象有关

    git对象分为下面3类

    git对象存储在.git目录下的objects文件夹中,Git会将git对象压缩成二进制文件,git对象的文件名即sha-1算法得到的hash值,按照2/38的形式保存(前两位是文件夹的名称,剩下38位是文件名,这样做可以防止文件夹的内容过多,提高查找效率)

    对于commit对象,hash值也被称为commitid

    可以使用以下命令查看git对象中的内容

    git cat-file -p <hash>

    通过查看三种git对象的内容,不难发现如下的组织关系

    其实可以吧hash看成每个对象的指针,Git通过指针将众多git对象串联起来,来实现对项目的版本控制

    用户通过Git命令读写.git文件夹,达到获取信息或变更版本的目的

    Git一开始被设计成供VCS使用的工具集合而不是一整套用户有好的VCS,它还包含了许多的底层命令,一般被称为plumbing命令(底层命令),而用户日常使用Git命令被称为porcelain命令(高层命令),porcelain命令实际是是对plumbing命令的封装

    一次完整的提交过程会包含如下过程

    使用porcelain命令的话是非常简单的

    如果使用plumbing命令就会复杂很多,但是可以更好地理解其背后的工作原理

    通过前文的内容不难发现,每次生成的commit对象会包含上一个commit对象的hash,即当前的commit包含上一个commit的指针,许多个commit对象串联起来就形成了分支

    所以,Git的分支本质上是指向commit对象的可变指针

    而HEAD代表当前commit的指向,.git/refs/heads/<branchname>文件的内容就是该commit对象的hash

    最新文章 更多
    最新素材 更多
    公司介绍 网站地图 图片资讯
    Copyright © 2010-2022 山东找图网络科技有限公司  鲁ICP备18007836号-3  邮箱:15653358549@163.com