git internal for computer scientists
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的更多相关文章
- FW: git internal
Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的, ...
- 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 ...
- (转) WTF is computer vision?
WTF is computer vision? Posted Nov 13, 2016 by Devin Coldewey, Contributor Next Story Someon ...
- [转载] 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 ...
- git workflow常用命令
git init git status git add readme.txt git add --all Adds all new or modified files git comm ...
- (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 ...
- git windows下载安装 (git命令)
Set up git At the heart of GitHub is an open source version control system (VCS) called Git. Git is ...
- [C6] Andrew Ng - Convolutional Neural Networks
About this Course This course will teach you how to build convolutional neural networks and apply it ...
- The Promise of Deep Learning
The Promise of Deep Learning By Yoshua Bengio Humans have long dreamed of creating machines that thi ...
随机推荐
- Oracle使用总结
1. 在ORACLE中Service Name即为数据库名称: 2. 在做删除操作时,需要加Commit进行操作提交: 3. 使用sqlldr将数据进行批量导入到ORACLE中: 3.1 Sqlld ...
- C#编写运行在Linux环境下的采用Mediainfo来获取多媒体文件信息的代码
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求调整为可以在Linux下运行,经过这两天的资料查找,实现了Linux下通过.NET来获取多 ...
- APP开发的三种技术对比
目前来说主流的App开发方式有三种:Native App .Web App.Hybird App.下面我们来分析一下这三种App开发方式的优劣对比: 一 :Native App 即 原生App开发 优 ...
- XNA项目基础
XNA项目基础 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Frame ...
- (转)虚拟路由器冗余协议【原理篇】VRRP详解
原文:http://blog.51cto.com/zhaoyuqiang/1166840 为什么要使用VRRP技术 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前常用的指定路由方法有两种 ...
- C# checked和unchecked运算符
1.作用 checked和unchecked运算符用于CLR(公共语言运行时)强制对它们所作用的代码块,进行(不进行)代码溢出检测 2.示例说明 有代码如下: static void Main(str ...
- ubuntu下安装Sublime Text2
1.下载Sublime Text2官网下载地址:http://www.sublimetext.com 2.安装Sublime Text2解压即可使用,如linjiqin@ubuntu:~$ sudo ...
- awk常用命令总结
awk工具,主要将一行分成“字段”来处理. awk '条件类型1{动作1} 条件类型2{动作2}...‘ filename awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或[tab ...
- C++要点总结
1.内联成员函数 1)隐式声明:将成员函数直接定义在类的内部 2)显式声明:inline标示 2)在类中,使用inline定义内联函数时,必须将类的声明和内联成员函数的定义都放在同一个文件中,否则编译 ...
- JavaScript中变量的LHS引述和RHS引用
JavaScript中变量的LHS引述和RHS引用 www.MyException.Cn 网友分享于:2015-02-04 浏览:0次 JavaScript中变量的LHS引用和RHS引用 在Jav ...