http://eagain.net/articles/git-for-computer-scientists/

git object storage仅仅是一个DAG of objects, 有几种类型的对象。他们都被压缩保存并以SHA-1 hash来标示。

blob:最简单的对象,仅仅是一堆字节的堆砌。常常它就是一个文件,但是也可以是一个符号链接或者任何其他的东西。指向该blob的对象来指定这个blob的具体语义。

tree: 目录由tree object来标示。他们引用相关的包含文件内容的blobs以及指向其他子目录的trees;

当一个node在DAG中指向另外一个node时,它将依赖于被指向的node: 也就是说这个node不可能在没有被指向的node情况下存在。无任何其他node指向它的node将被git gc命令回收空间,或者类似文件系统无文件名指向的inodes紧急救援命令一样来恢复:git fsck --lost-found

commit:一个commit引用到一个反映在commit执行时文件集状态的tree对象。它也引用0..n个作为它的父辈的commits。多于一个父亲commit则意味着这是一个merge commit,没有parent的commit意味着是initial commit,当然也有可能有不止一个initial commit的情况:这通常意味着两个独立的项目merge到一起了。commit对象的内容是commit 消息。

refs: Referrences,或者heads或者branches就像便签笔记一样提仔DAG里面的一个node上。不像DAG的特性只允许向里面添加node而不允许变更修改,这个便签笔记是可以任意移动的。他们并不在历史中记录,他们并不直接在repo之间传递,他们就像bookmark一样,告示着“i am working here".

git commit命令将向DAG中添加一个节点并且将当前branch的那个便签向前移动到这个新的node。

HEAD ref有其特别之处,因为它实际上指向另外一个ref.它通常指向当前活动的branch.常见的refs实际上在heads/xxx的namespace,但是你往往忽略heads/这个part

remote refs: Remote referrence被用另外一种颜色来标示出来,它也是一种便签。和normal refs的区别之处是different namespace,而事实是remote refs通常是由remote server来控制,git fetch操作时将会更新它们。

tag:一个tag不仅是DAG中的一个node并且也是一个便签。一个tag指向一个commit,并且包含一个可选的消息和一个GPG signature;

便签本身仅仅提供了一个快速访问tag的方法,一旦被丢失了,也可以通过git fsck --lost-found来找回;

在DAG中的节点可以从一个repo移动到另外一个repo,可以以更加高效的方式来保存(packs),并且不再使用的nodes将会被垃圾清理。

但是最后,一个git repo总是一个DAG以及对应的便签集合

History:

在有了上面关于git如何保存版本历史的知识后,我们如何能够将类似merges的动作可视化呢?最好用图形来表达:

上面是最简单的一个repo,我们clone了一个remote repo,而该repo只有一个commit在里面;

上面我们已经fetch了remote,该fetch包含了一个其他人的一个commit,而该commit还没有merge;

上图展示了在执行git merge remotes/myserver/master之后的情形。由于merge本事是fast forward(也就是说,我们在local branch上海没有任何新的变更,所以可以直接fast forward),在merge之后,仅仅的变更时:我们移动了我们的便签到新的node上去,并且相应地变更了working directory的内容;

上图中,我们本地有了一个commit并且做了一个git fetch动作,我们不断本地有一个新的commit而且也有了一个新的remote commit,在这种情况下一个merge是必须的。

git merge remotes/myserver/master执行的结果如上图。由于我们有新的local commits,这时就不再是fast forward,而必须通过在DAG中创建一个新的commit node来指示这个merge.这时注意merge commit有两个parent commits.

在上图中,我们做了几个新的commits并且有了新的merge。git DAG记录了任何已经发生过的action历史;

上面的”缝合“模式有时看起来很让人生烦。如果你还没有publish your branch,或者have clearly communicated that others should not base their work on it,你还有另外一个选项:你可以rebase你的branch,而不是merge.这样做的好处是:你的commit将由另外一个有不同parent的commit来替代,而你的branch将移动到那里。(这个commit将以remote branch的最新commit为parent commit)

你的老的commit将仍然保存在DAG中知道git的垃圾回收机制起作用删除它。当然,如果你有额外的便签指向老的commit,他们将永远指向它,并且正因为有人指向那个不用的commit,这样将使得这个旧的commit得以保存而不被垃圾清理掉。

不要rebase branches that others have created new commits on top of.

在垃圾回收后的情况如上图(或者仅仅或略unreachable commit),并且在rebased branch上创建一个新的commit

rebase也知道如何在一个commit中来rebase多个commits

git internal for computer scientists的更多相关文章

  1. FW: git internal

    Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的, ...

  2. What every computer science major should know 每一个计算机科学专业的毕业生都应该都知道的

    Given the expansive growth in the field, it's become challenging to discern what belongs in a modern ...

  3. (转) WTF is computer vision?

        WTF is computer vision? Posted Nov 13, 2016 by Devin Coldewey, Contributor   Next Story   Someon ...

  4. [转载] A set of top Computer Science blogs

    This started out as a list of top Computer Science blogs, but it more closely resembles a set: the o ...

  5. git workflow常用命令

    git init git status git add readme.txt git add --all         Adds all new or modified files git comm ...

  6. (30)3 ways to make better decisions — by thinking like a computer

    https://www.ted.com/talks/tom_griffiths_3_ways_to_make_better_decisions_by_thinking_like_a_computer0 ...

  7. git windows下载安装 (git命令)

    Set up git At the heart of GitHub is an open source version control system (VCS) called Git. Git is ...

  8. [C6] Andrew Ng - Convolutional Neural Networks

    About this Course This course will teach you how to build convolutional neural networks and apply it ...

  9. The Promise of Deep Learning

    The Promise of Deep Learning By Yoshua Bengio Humans have long dreamed of creating machines that thi ...

随机推荐

  1. Http Header之User-Agent

    Http Header之User-Agent User-Agent中文名为用户代理,简称 UA,它是一个特殊字符串头.通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信 ...

  2. 关于Sql注入的那些事

    登陆注册应该是每一个网站的必做的业务,但是在选择使用Django中的ORM还是说执行原生的Sql语句不同的人应该会有不同的建议,有经验的开发人员都喜欢原生的sql语句,因为相对于ORM来说,执行效率高 ...

  3. [转] Hive函数大全

    1.内置运算符 1.1关系运算符 运算符 类型 说明 A = B 所有原始类型 如果A与B相等,返回TRUE,否则返回FALSE A == B 无 失败,因为无效的语法. SQL使用”=”,不使用”= ...

  4. Oracle 数据库管理员及管理员的作用

    以下测试实例均在Oracle11gr2下测试!!! 一.简介:每个Oracle数据库应该至少有一名数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库,可能需要多个db ...

  5. MySQL prompt提示符总结

      A counter that increments for each statement you issue \D 当前日期 \d 当前数据库 \h 数据库主机 \l The current de ...

  6. Monkey入门之如何在android虚拟机中安装apk包

    如果想把公司的产品apk包安装到android虚拟机中,应该进行如下操作: 1.首先将apk包放到C:\Program Files\Android\android-sdk\platform-tools ...

  7. Android控件之ListView的使用

    ListView是Android当中一个非常常用的数据显示控件. 第一种可以使用List<HashMap<String , Object>>,作为适配器的数据源来显示要显示的数 ...

  8. bzoj 5315: [Jsoi2018]防御网络

    Description Solution 考虑每一条边的贡献 对于树边,如果两边各存在一个点,那么有贡献,总贡献就是 \((2^{size}-1)*(2^{n-size}-1)\) 分别对应两边的 \ ...

  9. Firebird DatabaseAccess WireCrypt DB2Provider

    目前最新的Firebird版本是:3.0.3 使用过程的一些必经问题,嵌入式的模式就不再说了. 在使用标准Server版时,第一个要考虑的就是数据库文件的存放位置,默认配置放在windows/syst ...

  10. WPF简单的数据库查询

    做一个简单WPF连接数据库的 控件类型和名称:DataGrid:dataGrid          Button1  :Button1              Button:   Button2   ...