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. easygui.py的安装和下载地址

    easygui下载地址:http://nchc.dl.sourceforge.net/project/easygui/0.97/easygui-0.97.zip 安装:解压后将easygui.py拷贝 ...

  2. 解决 jenkins 下使用 HTML Publisher 插件后查看 html 报告显示不正常

    查看官方文档后,原来是安全问题所导致的. Jenkins安全默认是将以下功能都关闭了1.javascript2.html上的内置插件3.内置css或从其它站的css4.从其它站的图处5.AJAX 我的 ...

  3. 使用WinSCP进行简单代码文件同步

    前言传输协议FTPFTPSSFTPSCP为什么使用WinSCP?CMD的FTP命令FileZillaPuTTYrsyncSublime的SFTP插件WinSCPWinSCP进行简单代码文件同步总结备注 ...

  4. COALESCE操作符

    一.应用场景 1.购买的零件和本地生产的零件都是零件,尽管多重的实体类型在数据存储上略有不同,但是它们有太多的相同之处,因此通常使用一个表格而不是两个. 所以这是如果我们需要计算零件的实际话费的话,那 ...

  5. android去除标题栏

    在 AndroidManifast.xml 文件中 将 theme="@style/AppTheme" 改为 theme="@style/Theme.AppCompat. ...

  6. Mybatis的关联查询(一)

    一对一的关联查询 一.使用resultType进行输出映射   1. 创建一个新的PO类,由于要将查询出来的属性映射到新的PO类.所有该PO类中应该有查询出来的所有列对应的属性. //定义新的PO类, ...

  7. group by 语句

    user E_book go 这样的程序会出错,因为play没有使用sum,所以要分组. group by play 有函数的和没有函数的表一起使用要用 GROUP BY .AVG 求平均值,只能与数 ...

  8. Java - XPath解析爬取内容

    code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } pre { backg ...

  9. linux修改用户名和密码

    linux修改用户名和密码 修改root密码:sudo passwd root 修改用户密码(如hadoop) sudo passwd hadoop 修改主机名:sudo vi /etc/hostna ...

  10. 五、cent OS防火墙常用命令

    查看防火墙开闭状态systemctl status firewalld 开启防火墙systemctl start firewalld 关闭防火墙systemctl stop firewalld 查看已 ...