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. 生成随机32位Token43位asekey

    // 生成随机32位Token字符和43位AseKey var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', ' ...

  2. 设置开机自动运行vncserver

    a. 在/etc/rc.d/rc.local文件中加入下面行   /etc/init.d/vncserver startb. 编辑/etc/sysconfig/vncservers   VNCSERV ...

  3. springboot整合security实现基于url的权限控制

    权限控制基本上是任何一个web项目都要有的,为此spring为我们提供security模块来实现权限控制,网上找了很多资料,但是提供的demo代码都不能完全满足我的需求,因此自己整理了一版. 在上代码 ...

  4. 关于table-layout的用法

    定义:tableLayout 属性用来显示表格单元格.行.列的算法规则. 自动表格布局:auto(默认) 在自动表格布局中,列的宽度是由列单元格中没有折行的最宽的内容设定的. 此算法有时会较慢,这是由 ...

  5. 【LESS系列】基本语法

    这里将直接以实例的方式展示 LESS 的基本语法. less code 是编译前的代码,css code 是编译后的代码. 本文的内容,同样是引自[http://www.ibm.com/develop ...

  6. ckeditor添加代码插入功能及高亮显示(插件)

    Auto SyntaxHighlighter SyntaxHighlighter CKEditor Button 下载以上两个插件,启用 以下可有可无: (设置在编辑器的显示样式) ckeditor高 ...

  7. SVN命令行怎么用?--转百度知道

    http://zhidao.baidu.com/link?url=uPWXURahp5KzdXbgrGTb9-r-abGaNC-J7dkhFkMhf062OJ1jeCM5wpBCgDR7bDg8uFr ...

  8. easyui焦点离开事件的解决方案

  9. node.js控制请求处理数量

    问题: 现在有一个接口,这个接口用到了无头浏览器,总之是一个比较消耗内存的接口,并发上来后,这个接口会把服务器内存榨干,导致服务器宕机.现在在不加机器的情况下,并发上来后我该怎么做既能处理掉所有请求又 ...

  10. easyui表单校验拓展

    /** * Created by chaozhou on 2016/5/30. */ /** * 扩展的基本校验规则, */ $.extend($.fn.validatebox.defaults.ru ...