git的使用

第一章 序言

背景

当前,一个谨慎、富于创造的人在开始一个项目时,都会采取备份策略,原因就是数据易于变化和丢失,比如把代码改错或者磁盘发生了灾难性的崩溃,因此将所有的工作经常归档是一个明智的选择。

对于文本和代码项目,备份策略包含:版本控制、跟踪管理修正版。每个开发者每天可以制作多个修正版本,日益增加的文本库可以同时起到创库、传播媒介、团队和产品管理工具的作用。为了适应工作习惯和项目组目标,这些工具提供的关键任务和版本控制就十分有用。

管理跟踪软件的不同版本或者其他内容的工具被称为:版本控制系统(VCS),源代码管理(SCM),修正控制系统(RVS),或者是以下几个字的组合:修正版本,版本,代码,内容,控制管理,系统等。虽然每个工具的作者和用户会私下讨论,但是这些工具都是解决同一个问题:开发和维护一个内容创库,提供访问每个资料的历史版本的方法,记录所有的更改。在本书中,我们用VCS这个术语来表示任何形式的版本控制。

这本书说的是Git,Git是一个功能齐全,低开销,灵活的版本控制工具,这给协作式开发带来很大的方便。Linux Torvalds开发Git是为了支持linux内核的开发,Git在大项目管理中更能体现其价值。

Git的诞生

当工具和项目发生冲突时,开发者一般会创建一个新的工具。的确,在软件的世界里,创建一个新的工具看似简单并充满诱惑。在当前现存的版本控制系统中,不是随便做一个决定就可以创建另外一个工具。但是,给定一个明确的需求,详尽的分析以及动机纯正,打造一个新的工具也是一个不错的选择。

Git就是这样的一个工具,被他的创建者亲切地称呼为“来之地狱的信息管理”。虽然在准确环境以及时间起源的问题上,不同的派别在Linux 内核论坛上有个争论,但是对于开发Git工具的激情来自哪里且有一致的认可:需要一个设计极佳的版本控制系统,该版本控制系统支持全世界大规模的软件开发。

在Git之前,Linux内核的版本控制采用商业版的BitKeeper VCS,其提供的复杂的操作在当时免费的版本控制系统(如RCS,CVS)不适用。当BitKeeper VCS在2005年春季在其“像啤酒一样免费”的版本中添加额外限制后,Linux团队意识到BitKeeper VCS不再是一个可行的方法。

Linus寻找备选方案,避开商业方式,他研究自由软件包,但是发现这些自由软件包有同样的限制和瑕疵,因此Linux没有采用它们。当时的版本控制系统怎么了?哪些难以捉摸的缺失的功能或者特征是Linus想要的,但没有找到?

容易分布式开发

分布式开发有许多方面,Linus希望一个新的版本控制系统能包含这些方面的大部分。这就要求在私人创库中平行,独立,同时开发,并且不需要和中央创库经常地同步,这就成了一个开发瓶颈。它允许许多开发者在不同的地方,甚至其中一些临时不在线上。

扩展到处理成千上万的开发

仅仅有分布式开发模块还远远不够。Linus清楚上千的开发者服务于每个Linux版本,所以新的版本控制系统处理大量的开发者,不管这些开发者是否工作在一个项目的同一模块或者不同模块。同时,新的版本控制工具必须具备可靠地整合所有工作的能力。

执行快速有效

Linus要求新的VCS快速有效。为了支持Linux内核产生的大量更新操作,个人的更新操作和网络传输操作必须很快,为了节省空间和这个传输时间,需要采用压缩和“三角洲”技术,采用分布式模型代替中央式模型可以确保网络延时不会阻碍日常的开发。

维护完整和可信

由于Git是一个分布式版本控制系统,确保数据的完整性非常重要。当数据从一个开发者传给另外一个,或者从一个创库到另外一个创库时,你怎么知道数据没有被改变?在这种情况下,你如何知道Git创库中的数据就是原本的数据?

Git采用了一个一般的密码哈希函数,叫做安全哈希函数(SHA1),用它来命名和识别一个在数据库中的对象,也许这个不完全,但是在实际中,对所有的Git开发创库而言,他可以确保数据完整性和可信性。

强制责任

版本控制的一个关键概率就是知道谁改了代码,并且最好说明原因。Git在改变一个文件并提交后会有一个强制的变更记录。这些变更记录包含:开发者,项目需求,管理,约定等。Git确保所有的更改都是可见的,因为所有的更改都有责任跟踪。

不可更改

Git创库数据库包含的数据对象不可更改,也就是说,一旦创建,并且放到数据库后,就不可更改。他可以被创建为不同 的数据,当然,原来的数据不能不计后果地更改。Git数据库的设计意味着储存在版本控制数据库中的历史数据也不可更改。用不可更改的对象有以下几个优点:可以快速的比较是否相等。

原子办理

在原子操作下,许多不同但相关的改变要么全部实现,要么都不实现。这个性质使得版本控制数据库在更新或者提交时不会留下部分改变的状态。Git的原子操作是如何实现的呢?就是通过记录完全离散的仓库状态,这个仓库状态不会再被分解为个体的或者更小的状态改变。

支持并鼓励分支开发

在一个项目里面,基本上所有的CVS都可以命名不同的开发代数。比如,一系列的代码改变可以被命名为development,而另外一个可以被叫做test。每个版本控制系统可以把一行开发分成多行,然后统一或者合并不同的分支。和许多VCS一样,Git叫一行开发名为分支,并给每个分支命名。

关于分支合并,正如Linus想的那样,希望简单的分支能够培养出开发的交替行,他也希望能够简单地促使这些分支合并。因为分支合并在版本控制系统中是一个痛苦和困难的操作,它必须支持干净,快速,简单的合并。

完整的仓库

由于开发者不需要查询中央仓库的历史版本信息,更重要的是每个仓库都有对每个文件的历史版本都有一个完整的拷贝。

明确的内部设计

虽然使用者不关心Git的内部设计,但是对于Linus和其他Git开发者而言却很重要。Git的对象模型有简单的结构,该结构能够扑捉原始数据,目录结构,记录编号的基本概念。通过全局统一标示技术来组合对象模型允许一个数据模型,该数据模型可以在分布式开发环境中被管理。

免费,自由

NUff说的

在一个干净的规范下创建一个新的CVS,许多天才软件工程师协作开发,从而产生了Git。需要时发明的动力。

先例

这本书包含版本控制系统的所有历史,这里有几个里程碑的创新性系统促使了Git的开发。(这一小结是可以选择的,当新的特征被简绍或者自由软件社区比较流行时,希望能够记录下来)

M.J.Rochkind 在1970年开发的源代码控制系统(SCCS)是用作UNIX的原始系统。这个是在UNIX系统上第一个可以得到的版本控制系统。

SCCS提供的中心存储叫做仓库,其中的一些基本概念也一直用到今天。SCCS提供了一个简单的锁模型,从而使开发序列化。如果一个开发者需要一些文件来测试程序,他需要将这些文件解锁。但是,为了能够编辑文件,又需要将这些文件锁上(UNIX系统的强制转换)。当完成后,他又需要将这些文件放到仓库中去,并解锁。

1980年早期,Walter Tichy 介绍了版本控制系统(RCS),RCS介绍了正向和反向三角概念,目的是为了有效地存储不同的文件版本。

并发版本系统(CVS),最初是由Dick Grun在1986年设计和开发,然后经由Berliner等扩展和修改,CVS变得越来越流行,而且在开源组织中成为标准已有多年。CVS相对于RCS有几个先进的地方:分布式开发、为整个模块设置的仓库维度变化。

另外,CVS为锁介绍了一个新的范例。鉴于早期版本开发者在改变文件之前需要锁住文件,导致另外的开发者需要等待。CVS给每个开发者在其私有的工作区以写的权限,因此,不同开发者开发的代码CVS将会自动合并,但开发同一行 代码时例外。在这种情况下,冲突会被标记,并且要求开发者自己修改。锁的新特征允许不同的开发者同时写代码。

可见的缺点和错误经常发生,导致出现一个新的版本控制系统,2001年出现的SVN,迅速在自由软件组织中流行,不行CVS,SVN自动提交变更,并能更好地支持分支操作。

Bitkeeper 和Mercurial完全违背上面提到的方法,每个都消除了中心仓库;存储是分布式的,给每个开发者提供和一个他自己的共享拷贝。Git源之点对点模型。

最后,MERcurialhe Monotone 设计了和一个散列指纹来唯一地标识一个文件的内容。标在文件上的名字是一个绰号,只是为了方便使用者操作,没有其他意义。Git也有这个特征,在内部,Git的标号是基于文件的内容,叫做内容寻址文件存储。这个概念优点过时,例如,参考“The Venti Filesystem”,Git借用了这个idea。

时间线

随着平台的创建,一些外在动力以及悲催的CVS危机的来临,Git在2005年4月就获得跳跃式发展。

Git在4月7号变成自承载,并提交了一下的信息:

commit e83c5163316...........

Author;Linus Torvalds <torvalds@ppc970.osdl.org>

Date:thu Apr 7 15:13:13 2005 -0700

Initial revision of "git" , the information manager from hell

从那以后不久,第一个Linux提交为:

commit:1da177e4c3f...........

Author:Linus Torvalds <torvallds@ppc970.osdl.org>

Date:Sat Apri 16 15:20:36 2005 -0700


linux-2.6.12-rc2


Initial git repository build.


let it rip(用心好好干)

那个提交将linux内核的大部分放入Git仓库,他由一下组成:

 17291 files change, 6718755 insert(+), deletions(-)

是的,这个是6.7百万行的代码。

3分钟后,内核中的第一个用Git打的补丁出现。Linus在2005年4月20好在linux内核文件列表里面宣布了这个补丁是可行的。

众所周知,Linus希望回到linux内核的开发,他在2005年5月25号,就把Git代码的维护工作交给了Junio Hamano 。并宣称选择Junio来维护是正确的。

2个月后,用Git发布了linux内核的2.6.12版本。

Git这个名字代表什么

Linus说他是一个任性的坏蛋,我按照自己的意思来命名所有的项目。首先是Linux,现在是Git。命名linux是因为linux是Linus和Minix的组合。在英国使用一个愚蠢毫无价值的人的名字作为一个术语不是一个错误。

同时,有些人也建议更改成一个更好解释的名字:the GlobalInformationTracker 就很流行。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值