Git — The stupid content tracker, 傻瓜内容跟踪器。Linus 是这样给我们介绍 Git 的。
Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
实际上内核开发团队决定开始开发和使用 Git 来作为内核开发的版本控制系统的时候,世界开源社群的反对声音不少,最大的理由是 Git 太艰涩难懂,从 Git 的内部工作机制来说,的确是这样。但是随着开发的深入,Git 的正常使用都由一些友好的脚本命令来执行,使 Git 变得非常好用,即使是用来管理我们自己的开发项目,Git 都是一个友好,有力的工具。现在,越来越多的著名项目采用 Git 来管理项目开发,例如:wine, U-boot 等。
说明:
此书介绍的内容要深入许多,尤其是对多人合作和分布式项目管理的讨论,在学习了Git的一系列命令之后,如何才能有效的使用它们管理项目、与他人合作?《Pro Git》专门在第五章里讨论了这些问题。这样就不用自己去摸索了。
本章介绍开始使用 Git 前的相关知识。我们会先了解一些版本控制工具的历史背景,然后试着在你的系统上把 Git 跑起来,直到最后配置好,可以开始正常的开发工作。读完本章,你就会理解为什么 Git 会如此流行,为什么你真的需要使用它。
《Pro Git》中文版 PDF 下载地址:
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2013年资料/5月/29日/《Pro Git》中文版 PDF
或者百度网盘下载:http://pan.baidu.com/share/link?shareid=590883&uk=487907638
附上书中一些tips:
为什么要用GIT
- 更顺畅的工作流程,开发过程中,完全可以离线操作
- 快速,Git分布式架构使得本地仓库包含所有的历史版本信息,你可以在不同的版本之间快速切换
- 弹性的本地分支,在svn下,你建一个分支需要把源代码复制到另外一个文件夹,而在Git下,创建分支的代价是非常小的,只需一条命令
- 仓库目录结构简洁,用Git复制一个项目,只会在项目根目录创建一个.git的目录,而其他目录很干净
- 内容按元数据方式存储,所有的版本信息都位于.git目录下
- 完整性好,更易于协作开发
- 用户群大,现在已经有成千上万个开源项目采用Git来做项目管理,github上更是有无数个代码仓库
GIT安装与配置
安装
1.从源码安装
在安装之前,你必须保证以下几个依赖包已经安装在你的系统上:curl, zlib, openssl, expat, libiconv。如果你的系统是Ubuntu,你可以这样安装:
apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
当所有的依赖项已经解决,就可以从http://git-scm.com/download上下载Git的源码,然后编译安装,具体命令如下:
tar -zxf git-1.*.*.*.tar.gz
cd git-1.*.*
make prefix=/usr/local all
sudo make prefix=/usr/local install
2.在Linux上安装
如果你的系统是Linux或者Fedora,你可以通过以下命令直接安装Git:
yum install git-core (fedora)
apt-get install git-core (ubuntu)
3.在Windows上安装
尽管Git是发源于Linux,但现在Windows上也有能够正常使用Git,只不过不支持中文,在Windows下所有的中文都显示问号,另外还有一些功能上的BUG。所以建议还是在Linux上去使用Git,如果你不得不工作在Windows上,你可以到http://msysgit.github.com/上下载msysgit的最新版,安装过程和其他Windows程序差不多,基本上点下一步就OK了。Msysgit默认会安装git bash和git GUI这两个程序,一般用git bash就可以了,它支持常用的命令。如果对Linux命令行不熟,你也可以用用git GUI,但功能有限制。
第一次使用GIT
在你安装好Git之后,你需要修改一些配置,才能正常使用Git。
Git通过“git config”命令来配置Git,这个命令有2个选项:--system, --global, 加上默认选项,分别对应Git上3级配置文件。第一个是/etc/gitconfig文件,和--system对应,这是全局配置文件,修改这个文件,将会影响系统上所有的用户,所有的仓库。第二个是你家目录下的/.gitconfig文件,与--global对应,修改它会对你当前用户的所有仓库产生影响。第三个是你仓库中的.git/.gitconfig文件,这是“git config”默认修改的配置文件,它只会对你当前仓库产生影响。
在第一次使用Git时,你需要告诉你的协同开发者,你是谁以及你的邮箱,在你提交的时候,Git需要这两个信息。具体通过以下命令设置:
git config --global user.name “Test OSS”
git config --global user.email oss.lzu.edu.cn@gmail.com
当然你也可以不用--global选项,但这意味这你在每一个仓库中都要这样设置。
同时,你也可以指定你的编辑器,你的Diff工具:
git config --global core.editor vim
git config --global merge.tool vimdiff
你还可以通过”git config --list”命令来查看你的设置。
当你把Git设置好之后,如果你要和从Git服务器上获得仓库,或者向Git服务器提交你的代码(比如github),你可能需要生成你自己的ssh密钥对。Git支持4种与服务器端通信的协议:git、http、ssh和https。其中git只是一个只读协议,也就是说你只可以从服务器端获取仓库,但是你不能提交你自己的代码。而http和https用的很少,大部分都只支持ssh协议和Git协议。
当你通过ssh协议与远端服务器进行通信的时候,你可以通过以下命令生成ssh密钥对:
ssh-keygen -t rsa
如果你没有指定密钥名称和存放路径的话,它默认把两个不对称密钥放在你的家目录下的.ssh目录下,密钥文件默认名称为id_rsa和id_rsa.pub,前者是私钥,后者是公钥。中间可能会要你设定访问密钥密码,这个可以设,可以不设,但为了安全考虑,还是建议你设一个访问密码。否则,意味着任何持有你密钥的人都可以使用该密钥。
然后把你的公钥发给Git仓库管理员,然后你就可以通过ssh协议来访问服务器端,期间程序会自动进行密钥对匹配,如果你设了访问密码,你可能需要输入密码。
更多关于ssh的内容,请访问这里:http://www.freebsd.org/doc/zh_CN/books/handbook/openssh.html
这些设定完之后,你可以通过获得任何一个公开的代码仓库来检测你的git是否工作正常。比如下面这个:
git clone git://git2.kernel.org/pub/scm/git/git.git
GIT仓库
Git做为一个资源管理和跟踪系统,如果想要把自己的文件托管在Git上,那么首先你得让Git知道你需要管理的文件在哪。比如说现在我有一个项目,它在test文件夹里,我想让Git管理这个项目,这个时候你需进入到这个目录,然后运行“git init”命令。这个时候Git就会在该目录下生成一个.git的隐藏目录,Git用来进行版本控制和内容跟踪的所有文件都在该文件夹下。
处于git跟踪下的文件只具有三种状态:
- Modified(working directory):被修改过的文件
- Staged(staging area):通过git add添加到暂存区域的文件
- Committed(git directory):通过git commit提交到仓库的文件
所以,一般的git工作流程可能是这样:修改过某些文件,然后把这些文件添加都暂缓区,再提交到仓库中形成一个版本或快照,最后提交到git服务器上。而在中间,可能伴随着分支管理,分支切换,撤消与合并。
可能有些人会觉得很奇怪,为什么git会有暂存区域这个概念,直接提交到仓库中不就ok了。其实这是git为了做版本控制用的,试想如果没有暂存区域,每修改一个文件,就会形成一个版本,太过频繁,不易于管理。暂存区域其实就是下一个版本的文件清单,你可以*控制该往仓库中提交什么文件,这也可以避免在一个版本中包含一些中间文件,比如编译后的文件。