1、 Git 背景
Git 最初由Linus Torvalds编写,用于 Linux 内核开发的版本控制工具。
Git 与常用的版本控制工具 CVS、Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。
Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要,Git 最为出色的是它的合并跟踪(merge tracing)能力。
实 际上内核开发团队决定开始开发和使用 Git 来作为内核开发的版本控制系统的时候,世界开源社群的反对声音不少,最大的理由是 Git 太艰涩难懂,从 Git 的内部工作机制来说,的确是这样。但是随着开发的深入,Git 的正常使用都由一些友好的脚本命令来执行,使 Git 变得非常好用,即使是用来管理我们自己的开发项目,Git 都是一个友好、有力的工具。现在,越来越多的著名项目采用 Git 来管理项目开发,例如:wine、hiphop-php 等。
Git 作 为开源自由原教旨主义项目,没有对版本库的浏览和修改做任何的权限限制,但通过其他工具也可以达到有限的权限控制,比如:gitosis、 CodeBeamer MR。原本 Git的使用范围只适用于 Linux / Unix 平台,但逐步并成熟了在 Windows 平台下的使用,主要归功于Cygwin与msysgit环境与TortoiseGit这样易用的 GUI 工具。其实 Git 的源代码中已经加入了对 Cygwin 与 MinGW 编译环境的支持并被逐步完善,对于 Windows 使用者是个福音。
2、 为什么选择Git
流行的软件版本开源管理软件,有CVS、SVN、GIT版本管理工具,Git的优势在哪里呢?
Git 入门教程,请查看我的百度空间博客:Blog
Git 和 CVS、SVN不同,是一个分布式的源代码管理工具,它很强,也很快,Linux内核的代码就是用Git管理的,它给我们带来的直接好处有:
1. 初始化,git init, git commit -a, 就完了。对于随便写两行代码就要放到代码管理工具里的人来说,再合适不过。也可以拿git做备份系统,或者同步两台机器的文档,都很方便。
2. 绝大部分操作在本地完成,不用和集中的代码管理服务器交互,终于可以随时随地大胆地check in代码了。 只有最终完成的版本才需要向一个中心的集中的代码管理服务器提交。
3. 每次提交都会对所有代码创建一个唯一的commit id。不像CVS那样都是对单个文件分别进行版本的更改。所以你可以一次性将某次提交前的所有代码check出来,而不用考虑到底提交过那些文件。(其实SVN也可以做到这点)
4. branch管理容易多了,无论是建立新的branch,还是在branch之间切换都一条命令完成,不需要建立多余的目录。
5. branch之间merge时,不仅代码会merge在一起,check in历史也会保留,这点非常重要。
Git 的优势主要有:
1、更方便的 Merge
分 布式管理必然导致大量的 Branch 和 Merge 操作。因此分布式版本控制系统都特别注意这方面。在传统的 CVS 里面制 作 Branch 和 Merge 简直就是噩梦,Subversion 作为一个用于替代 CVS 的系统,专门改进了 Branch 操作。然而似乎 人们没有注意到,Branch 是轻松了,可是 Merge 呢?如果不能很方便地 Merge 回来,做 Branch 仍然是噩梦。事实上,我就经历 过在开发团队里面由于队友操作不对而在 Merge 的时候把我的许多代码都覆盖掉了。当时正是使用的 subversion 。虽然源代码仍然在历史里 面,但是要去一个一个地找出被覆盖掉的文件并恢复过来确实是一件很难忘的事情。
2、更方便的管理
传统的版本控制系统使用中央仓库,一些仓库相关的管理就只能在仓库上进行。赋予开发团队每一个人中央仓库的管理权限是非常不好的。但是有时候确实会比较不方便的地方。
3、更健壮的系统
分布式系统一般情况下总是比单服务端的系统要健壮,因为当服务端一旦挂掉了整个系统就不能运行了。然而分布式系统通常不会因为一两个节点而受到影响。
4、对网络的依赖性更低
虽 然现在网络非常普及,但是并不是随时随地都有高速网络,甚至有时候根本没有网络可以访问。低速的网络会让人心情烦躁,有时候就呆呆地盯着屏幕上 的 commit 进度,什么事情也干不了。而没有网络连接更是致命的:你无法 commit !这表示你进行任何改动以前都必须小心翼翼,否则你可能再 也找不会你曾经写的一些代码了。
5、更少的“仓库污染”
有 时候你要做一个模块,它不是太大,所以没有必要为它新建一个 branch ,但是它又不是那么小,不可能一次提交就做好。于是便会提交一些不完整的代码 到仓库,有时候会导致整个程序无法运行,严重影响团队里其他人的开发。大多数人在这种情况下的解决办法都是写完之后再提交。但是作为习惯了版本控制的人来 说,进行不计后果的大幅修改是经常的事情,到后来突然发现自己先前的代码没有提交,就后悔莫及了。如果是分布式系统的话就不会存在这样的问题,因为本地仓 库的修改不会影响到别人的仓库。当你完成并测试以后,就可以在邮件列表里面说:我已经把这个模块做好了。然后感兴趣的人就可以从你这里 pull 你的成 果了。
虽然网上各种对Git的誉美之词决不止于此,但是在Git的主站上,还是尽可能客观的对Git和Subversion进行了一番比较(GitSvnComparsion)。另外,Subversion目前通过 SVK 也已经提供了一定程度上的源代码库分布式的管理能力,能够实现源代码的离线提交等功能。
Git 在Windows上的使用
Git 是为Linux而生的,其最初创建人就是Linux的创始人—— Linus Torvalds
Linux环境下,使用Git 与任何Linux中的命令行工具没有什么区别,甚至在击键数上还有明显的优势。
Windows环境下,使用Git在目前看来只有两种方法:
1、使用 Cygwin(一个在Windows上运行的Linux环境)
2、使用 msysgit(Windows下提供图形界面和命令行)
Cygwin和msysgit的使用方法类似,Cygwin具有大量Linux的功能,如果只是想使用Git功能,msysgit还是最简单和快速的方法。
为了能够具备通过互联网实现与别人协作开发的能力,对于项目需要一个公开的源代码托管服务。好在,现在已经有不少可以供我们选择的,尤其是githost, 更是一个中文的源代码托管服务提供方。从目前看来,在Githost上落户的项目还很少,貌似是一个新近诞生的服务提供方。如果项目对服务提供的稳定性有 比较高的要求的话,还是选择较老的git源代码托管服务比较好吧。如果是在局域网内工作的小组,要使用Git做源代码管理,那就更简单了,大家安装好自己 的Git,并指定一个人负责对Git版本库进行管理就好了。
(1) GitHub简介
GitHub是使用Ruby开发的,具有清爽的界面。
GitHub提供免费的源代码库托管,同时也提供付费的托管服务。通过付费私有库托管服务在财务上支持免费部分的持续运营。
GitHub提供了一套独特的代码库管理界面功能,并提供项目Wiki的能力。
GitHub提供了一系列的指南,官方网址:GitHub
(2)Windows系统上安装Git
首先,下载并安装msysgit程序:download
接着,安装下载的 Git-1.7.10-preview20120409.exe,可以选择最新的Git版本,以取得更好的使用效果。
安装的过程很简单,基本上可以使用默认设置。只是在设置路径的时候要注意一下,为了避免与Windows路径导致的意外情况,还是使用“Use Git Bash Only”比较安全。
Msysgit 有命令行和图形UI两种使用方式,根据你的喜好选择吧,要说的是,图形UI可能不能完成所有的工作,因此在某些情况下(例如创建SSH Key),命令行还是必不可少的。Msysgit的Bash命令行对中文的支持不好,所有的中文字符都显示成了“?”。因此,为了避免麻烦,最好避免使用 中文的文件名、目录名和用户名等
(3) 设定GitHub
要使用GitHub,首先需要创建SSH Key,SSH将用来加密本机与远端服务器之间的通信,同时也是识别你对代码所做的变更的方法。
SSH Key可以使用Git命令行来产生,如果你已经有一个SSH Key,那么在这里也可以直接使用。
要使用Git创建SSH Key 首先需要打开Git Bash 命令行,输入命令:
ssh-keygen -C "username@email.com" -t rsa
说明:username@email.com 需要更换成你自己的email地址
程序将提出一些问题,接受文件默认存放位置,当要求输入pass phrase时,如果本机安全没有问题,也可以不输入。找到当时制定的文件存储位置中id_rsa.pub文件,这就是在GitHub上申请帐户时需要使用的SSH公钥文件。
在github.com的register中选择Free account,在后续的界面中按照要求填入相应的内容即可完成注册,很简单的。
5、 Git 服务相关
1、 建立Git远程服务器:
目前貌似还没有在Windows上建立Git服务器的,足见Linux在开源社区里强大的优势啊!^_^
Hosting Git repositories, The Easy (and Secure) Way :gitosis
6.Git 的诞生(很传奇)
先简看一下,下面的图片,是不是很熟悉,嘿嘿!
简单说:Linus开发Linux内核,需要版本控制器,于是开发了Git。下面是开发周期:
-
2005/4/3 开发;
-
2005/4/6 发布;
-
2005/4/7 管理自身;
-
2005/6/16 管理Kernel2.6.12。
大牛是怎么定义的呢?大家可以体会一下。哈哈^_^…… Git 迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至 GitHub,包括jQuery,PHP,Ruby等等。至于Git与GitHub的关系,会再下面的文章里说明。
四、集中管理 vs 分布式管理
Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 下面我们来看看两张图:
1.集中管理
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干 完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
缺点:
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M~20M的文件就需要10分钟甚至更多时间,这还不得把人给急死啊。
2.分布式管理
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样, 你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文 件file,你的同事也在他的电脑上改了文件file,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可 能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换” 大家的修改,没有它大家也一样干活,只是交换修改不方便而已。如上图!
五、Git 特点
1.Git 总结
-
分布式
-
存储快照而非差异
-
本地有完全的版本库,几乎所有操作都在本地
-
有内在的一致性,SHA1
-
优秀的分支管理
-
支持各种协同模式
-
开源,有一些第三方软件可整合使用,几乎所有操作都是
2.与CVS/SVN,Git 的优势
-
支持离线开发,离线Repository(仓库)
-
强大的分支功能,适合多个独立开发者协作
-
速度块
六、Git 原理
1.四种基本类型
-
BLOB:每个blob代表一个(版本的)文件,blob只包含文件的数据,而忽略文件的其他元数据,如名字、路径、格式等。
-
TREE:每个tree代表了一个目录的信息,包含了此目录下的blobs,子目录(对应于子trees),文件名、路径等元数据。因此,对于有子目录的目录,git相当于存储了嵌套的trees。
-
COMMIT:每个commit记录了提交一个更新的所有元数据,如指向的tree,父commit,作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当次提交时的目录信息。一个commit可以有多个(至少一个)父commits。
-
TAG:tag用于给某个上述类型的对象指配一个便于开发者记忆的名字, 通常用于某次commit。
2.工作区(Working Dir),提交区/暂存区(stage/index),版本库