玩转 Git 三剑客
苏玲
携程代码平台负责人
60828 人已学习
新⼈⾸单¥68
课程目录
已完结/共 62 讲
第三章:Git与GitHub的简单同步 (4讲)
第五章:Git集成使用禁忌 (2讲)
玩转 Git 三剑客
登录|注册
留言
37
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 10 | commit、tree和blob三个对象之间的关系
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程综述
02 | 安装Git
03 | 使用Git之前需要做的最小配置
04 | 创建第一个仓库并配置local用户信息
05 | 通过几次commit来认识工作区和暂存区
06 | 给文件重命名的简便方法
07 | 通过git log查看版本演变历史
08 | gitk:通过图形界面工具来查看版本历史
09 | 探密.git目录
10 | commit、tree和blob三个对象之间的关系
11 | 小练习:数一数tree的个数
12 | 分离头指针情况下的注意事项
13 | 进一步理解HEAD和branch
14 | 怎么删除不需要的分支?
15 | 怎么修改最新commit的message?
16 | 怎么修改老旧commit的message?
17 | 怎样把连续的多个commit整理成1个?
18 | 怎样把间隔的几个commit整理成1个?
19 | 怎么比较暂存区和HEAD所含文件的差异?
20 | 怎么比较工作区和暂存区所含文件的差异?
21 | 如何让暂存区恢复成和HEAD的一样?
22 | 如何让工作区的文件恢复为和暂存区一样?
23 | 怎样取消暂存区部分文件的更改?
24 | 消除最近的几次提交
25 | 看看不同提交的指定文件的差异
26 | 正确删除文件的方法
27 | 开发中临时加塞了紧急任务怎么处理?
28 | 如何指定不需要Git管理的文件?
29 | 如何将Git仓库备份到本地?
30 | 注册一个GitHub账号
31 | 配置公私钥
32 | 在GitHub上创建个人仓库
33 | 把本地仓库同步到GitHub
34 | 不同人修改了不同文件如何处理?
35 | 不同人修改了同文件的不同区域如何处理?
36 | 不同人修改了同文件的同一区域如何处理?
37 | 同时变更了文件名和文件内容如何处理?
38 | 把同一文件改成了不同的文件名如何处理?
39 | 禁止向集成分支执行push -f操作
40 | 禁止向集成分支执行变更历史的操作
41 | GitHub为什么会火?
42 | GitHub都有哪些核心功能?
43 | 怎么快速淘到感兴趣的开源项目?
44 | 怎样在GitHub上搭建个人博客
45 | 开源项目怎么保证代码质量?
46 | 为何需要组织类型的仓库?
47 | 创建团队的项目
48 | 怎样选择适合自己团队的工作流?
49 | 如何挑选合适的分支集成策略?
50 | 启用issue跟踪需求和任务
51 | 如何用project管理issue?
52 | 项目内部怎么实施code review?
53 | 团队协作时如何做多分支的集成?
54 | 怎样保证集成的质量?
55 | 怎样把产品包发布到GitHub上?
56 | 怎么给项目增加详细的指导文档?
57 | 国内互联网企业为什么喜欢GitLab?
58 | GitLab有哪些核心的功能?
59 | GitLab上怎么做项目管理?
60 | GitLab上怎么做code review?
61 | GitLab上怎么保证集成的质量?
62 | 怎么把应用部署到AWS上?
本节摘要
登录 后留言

全部留言(37)

  • 最新
  • 精选
1900
现在我们应该明白git底层的运行流程了,当我们添加或者修改了文件并且add到Stage Area之后,首先会根据文件内容创建不同的blob,当进行提交之后马上创建一个tree组件把需要的blob组件添加进去,之后再封装到一个commit组件中完成本次提交。在将来进行reset的时候可以直接使用git reset --hard xxxxx可以恢复到某个特定的版本,在reset之后,git会根据这个commit组件的id快速的找到tree组件,然后根据tree找到blob组件,之后对仓库进行还原,整个过程都是以hash和二进制进行操作,所以git执行效率非常之高。

作者回复: 👍

2019-05-01
2
37
codenon
老师好,每次commit,git 都会将当前项目的所有文件夹及文件快照保存到objects目录,如果项目文件比较大,不断迭代,commit无数次后,objects目录中文件大小是不是会变得无限大?

作者回复: 很好的问题!我们10号视频对象关系那一节提到blob,Git对于内容相同的文件只会存一个blob,不同的commit的区别是commit、tree和有差异的blob,多数未变更的文件对应的blob都是相同的,这么设计对于版本管理系统来说可以省很多存储空间。其次,Git还有增量存储的机制,我估计是对于差异很小的blob设计的吧。

2018-12-12
23
大米饭
老师好,请问git是如何判断blob文件未被修改过呢?里面存在有存在什么技巧吗?

作者回复: Google或者必应的国际版 里面搜索“git how to check whether blob content changed” --> 点击 “http://www-cs-students.stanford.edu/~blynn/gitmagic/ch08.html” ,web页面里面搜索“whether a file has changed” 。看来Git先把文件的大小、创建时间、最后修改时间信息放在index里面,只要把当前的状况和index的内容做比较,就能判断blob是否变更了。

2018-12-10
8
有铭
git cat-file -p的时候,你输入的是那段hash值的前面11位就行了吗?更短行不行?

作者回复: 只要git不报错,都行啊

2018-12-11
7
老师 有关 Blob 对象是怎么存储的能讲解一下吗?这个对实际存储有点疑问

作者回复: 好问题,稍等。不好意思,让你等了这么久。 https://github.com/gotgit/gotgit/blob/master/02-git-solo/030-head-master-commit-refs.rst 当年《Git权威指南》,现在作者开源了。这节的内容当下还是适用的

2018-12-15
2
6
曾小福气
苏玲老师,如果现有的git仓库size较大,比如几个G了,要想减小仓库的大小,有没有比较好的压缩工具或者删除方法呢?

作者回复: 好问题。像GitLab这些平台,本身就会对git仓库做压缩等事务,如果你们仓库大是因为存放了大文件的话,建议找找GitLab LFS资料看看。 如果不是大文件引起仓库大,就是文件个数多,commit个数多引起仓库大,想让仓库变小的话,办法也有多种。比如从某个版本后新建git仓库,也可以清理不用的分支(从而删除只在该分支上的commit),还可以只保留主分支的commit。有空我帮你找找资料再交流吧。

2019-12-29
2
4
乘风破浪
老师好,对于同一个分支来说相同的文件存储为一个blob,不同分支是一个吗,对于同一个分支来内容是相同的,不同分支相同的文件应该不是同一个blob吧?

作者回复: 换个思路想,如果我们自己是Linus,在设计版本管理工具的时候,会不会考虑把内容相同的文件当做一个对象来处理呢?还是说不同分支,即使内容相同也存为不同的对象? Linus选择的是前者,甚至于不同的git仓库,只要内容相同的文件,其blob的HASH值也是相同的。大家可以做实验验证一下。

2019-09-07
4
松n_n鼠
本节的内容是不是可以理解为: 每一次commit都对应一个tree,那这个tree是包裹在最外层的一个tree,使用git cat-file -p 命令的时候查看tree内部的内容,这里的每一个文件夹都可以看成一个tree,而在这些文件夹中的具体文件内容两两不相等文件都是一个blob,内容相同的文件统一为一个blob?

作者回复: 👍,理解到位

2019-02-18
4
yazid
对于tree能不能这么理解呢:它就是个文件夹对象

作者回复: git中的文件夹确实就是用tree组织的。从现有知识来看,可以把tree对应于文件夹对象。

2019-01-09
4
geek
老师接着我上边的那个问题,其实我是想把暂存区中的文件撤销,(我在项目中删除了一个文件,这时它就进入了暂存区,发现没了这个文件有些地方出问题了,就想把它还原成没删除的样子,但是在这之前我提交了大量的代码,还push了几次,担心把我之前的代码整没了,所以焦急万分,特来请教)!

作者回复: 不用担心的,找得回来的。如果删除的文件还没有生成commit,你用git status 看一下,它有说明教你怎么恢复文件的。 用 git reset HEAD -- 被删除的文件 ,这样试试看,能恢复不?

2018-12-18
2
收起评论