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

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

    
     12
  • liujinmai
    2018-12-27
    最近学习任务比较多,所以看的比较慢。
    这一节视频,和上一节,真的是让我感觉我内在慢慢认识git. 上一节介绍3个对象的时候听懵逼,这一节马上就懂了,我发现git的难学就是因为他的概念和设计理念,命令学起来就是分分钟的事,关键是内在,最后说一句,Linus真是个天才。
    
     6
  • 有铭
    2018-12-11
    git cat-file -p的时候,你输入的是那段hash值的前面11位就行了吗?更短行不行?

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

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

    作者回复: 👍

     1
     4
  • yazid
    2019-01-09
    对于tree能不能这么理解呢:它就是个文件夹对象

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

    
     3
  • 一步
    2018-12-15
    老师 有关 Blob 对象是怎么存储的能讲解一下吗?这个对实际存储有点疑问

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

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

    作者回复: 好问题。像GitLab这些平台,本身就会对git仓库做压缩等事务,如果你们仓库大是因为存放了大文件的话,建议找找GitLab LFS资料看看。

    如果不是大文件引起仓库大,就是文件个数多,commit个数多引起仓库大,想让仓库变小的话,办法也有多种。比如从某个版本后新建git仓库,也可以清理不用的分支(从而删除只在该分支上的commit),还可以只保留主分支的commit。有空我帮你找找资料再交流吧。

     1
     1
  • 乘风破浪
    2019-09-07
    老师好,对于同一个分支来说相同的文件存储为一个blob,不同分支是一个吗,对于同一个分支来内容是相同的,不同分支相同的文件应该不是同一个blob吧?

    作者回复: 换个思路想,如果我们自己是Linus,在设计版本管理工具的时候,会不会考虑把内容相同的文件当做一个对象来处理呢?还是说不同分支,即使内容相同也存为不同的对象?

    Linus选择的是前者,甚至于不同的git仓库,只要内容相同的文件,其blob的HASH值也是相同的。大家可以做实验验证一下。

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

    作者回复: 👍,理解到位

    
     1
  • 大米饭
    2018-12-10
    老师好,请问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是否变更了。

    
     1
  • AllenGFLiu
    2020-02-02
    $ git cat-file -p e93688ca7ceb8e
    tree 8a885d625fda615cd456339ae23d8a921be0c3f4
    parent 32741376611ab486e2c295a146490cf866eb723e
    author yonggege <jamwong994@gmail.com> 1494828963 +0800
    committer GitHub <noreply@github.com> 1494828963 +0800

    请问老师 tree 下边的这个parent类型是什么?老师好像没提。
    展开
     1
    
  • Allen_
    2019-10-31
    老师,这里如果每一个commit都存一份自己的files,那多commit几下不是很快内存就用完了?这里git是怎么优化的呢?

    作者回复: commit里面涉及文件内容的那部分都存在blob中,内容相同的文件用的是相同的blob。举个例子,commit1有1000个文件,commit2在commit1上只修改了1个文件,那么,其中没发生变化的999个文件这俩个commit用的是相同的blob。存储就节约下来了,

    
    
  • 兔2🐰🍃
    2019-07-27
    老师你好,请问 git cat-file -p xxxx(tree的hash值) 时,显示 040000 tree ..., 100644 blob ..., 这里tree和blob前面的6位数字代表什么,发现是固定的数值。
    
    
  • OzoraTsubasa
    2019-01-20
    老师:
    1.每次commit 操作 都会产生一个tree 这个tree 是包含整个项目中的所有文件夹及文件和本次新增的文件,是这样吧老师。
    2.如果是这样的话 我想查看本次commit 具体操作了哪些文件,使用什么命令查看。

    作者回复: 1. 理解正确。
    2.方法可能不止一种,我现在提供给你一种:
       git cat-file -p 某个commit的hash
       git cat-file -p 该commit对应的tree的hash

    
    
  • 张祥儒
    2019-01-20
    老师,为什么我的电脑没有tree的概念呢?cd objects, cd 09 , git cat-file o9+hash 打印出来的是blob,完后我gitk也和您的不一样,没有tree的那个样子,麻烦老师解答下,谢谢

    作者回复: 你还没有创建commit的话,是没有tree的。先建立一个commit出来。

    
    
  • 万想
    2019-01-05
    针对 “Daniel” 的问题,我尝试了你描述中的操作。跟着 “git status” 的描述方法来,是可以解决的。

    git reset HEAD <filename> # 将修改从缓存区撤销
    git checkout -- <filename> # 从版本历史中,取出来最新的该文件
    -----------------
    这两个命令也可以合成一步进行操作,可以考虑尝试一下~
    git checkout HEAD <filename>
    展开

    作者回复: 👍

    
    
  • omg_boy
    2019-01-05
    每个blob的位置(深度)是怎么确定的?深度为1下的blob和深度为2下的blob有什么关系了?

    作者回复: blob用来存储文件内容的,同一个blob可以出现在不同的tree里面,不同的tree可以包含相同的blob。

    
    
  • 🐼 Jeffrey
    2018-12-31
    苏玲老师,我有两个疑问:1.关于 author和commit的关系,您将的没太听懂;2.关于git设计者很聪明每个文件内容相同指存放一份内容,是什么意思?能具体描述下吗?谢谢。

    作者回复: author和committer的内容在后面github视频课里面还会讲。既然一个commit设计两个角色,git应该不是画蛇添足。

    第二个问题,说白了就是内容相同的文件,不管文件名叫什么,在git眼里只是一个blob。

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

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

    用 git reset HEAD -- 被删除的文件 ,这样试试看,能恢复不?

    
    
我们在线,来聊聊吧