Chinaunix首页 | 论坛 | 博客
  • 博客访问: 502993
  • 博文数量: 102
  • 博客积分: 4001
  • 博客等级: 上校
  • 技术积分: 756
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-21 16:01
文章分类

全部博文(102)

文章存档

2011年(1)

2010年(1)

2009年(56)

2008年(44)

我的朋友

分类: LINUX

2009-03-09 20:58:07

以前仅仅掌握了git的基本用法,对git里的很多概念还是不清楚。鉴于使用git之频繁,今天决定仔细学习一下git。

简单地搜了一下,发现中文的似乎就没有很深入介绍git的,都是一些基本的东西。英文教程中,最好的当然是kernel.org官方的教程,一篇详细介绍了git的概念,可以在得到;另一篇介绍了一些更核心的东西,在。

git里有两个强悍的东西,一个是object database,一个是index file。先看前面那个,所谓object database就是存放所有object的一个“数据库”,其实就是.git/objects,里面放的东西自然都是object。git里的 object分四种类型:tree,blob,commit,tag。所有的object都有各自的“编号”,叫ref,就是你每次git-log时看到 的里面那长长的16进制数字,比如下面这个:

$ git log
commit 03bbe082cffc4533f6557bf23f0c672307067246
Merge: 3047290… fb49161…
Author: Linus Torvalds <>
Date: Thu Jan 17 15:50:19 2008 -0800

这个object的类型显然是commit。这个数字是怎么来的呢?其实就是对object的内容,时间,作者等信息进行SHA1之后得到的。如果 你上网络安全课没有睡着的话,你应该知道,这玩意儿其实是为了保证数据的完整性。这样一来保证了不同的object的“编号”不会相同,二来保证了 object内容和其它信息的完整。

我们再继续看那四个类型,commit刚才已经看到,它其实就是表示对文件的修改。而一个文件的内容被称为blob,一个目录的状态被称作 tree。由此可见,commit是基于tree的,它引用它的parent,表示从这个parent这个tree到历史上另一个tree的“过程”。 git-cat-file可以帮助我们查找某个object的类型,或者查看它的内容。而git-ls-tree可以帮我们查看tree的内容。tag object是一个包含tag的object,而tag通常是一个指向某个tag object或commit object的ref,所以我们可以在.git/refs里看到tags。再多说一句,在commit里面,HEAD恐怕是最有名的一个了。;-)

好了,我们再接着看index file。这又是个什么东西呢?也很简单,它其实是个“子虚乌有”的东西,当你对tree里的东西做了修改后,你可以git-diff查看修改,而当你再 git-add之后,不带任何参数的git-diff就查不到结果了,因为修改都放到index file里去了!index file又是实实在在存在的,它在.git/index里,以二进制的形式存放。再回头来看,不带任何参数的git-diff其实比较的是index file和当前目录内容的差异。你git-commit一次其实就是把一次git-add的内容加入历史,而git-commit -a才是把所有git-add的结果加入。

还有什么不明白的呢?恩,head,注意,这个是小写,和上面提到的大写的那个不同。head其实应该是指某个ref,不信你看.git/refs /heads。为什么这里是叫heads呢?因为一个branch一个head,branch可能有多个,heads自然就是复数了。一般我们的 heads里都有个master,看看它的内容,其实就是一个ref。

这样我们就对git里的概念有了个大体了解了,至少不至于连git的man pages都看不懂了。

阅读(1234) | 评论(0) | 转发(0) |
0

上一篇:android 简单的内核分析

下一篇:sudo和tee

给主人留下些什么吧!~~