【Git学习】初识git:简单介绍及安装流程
1.Git简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。一些商用的版本控制系统,虽然比CVS、SVN好用,但付费,和Linux的开源精神不符。
到了2002年,Linux系统已发展了十年,代码库之大让Linus很难继续通过手工方式管理了,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了,要收回Linux社区的免费使用权。
于是Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
2.Git的特点
2.1集中式vs分布式
集中式版本控制系统
集中式的版本控制系统( Centralized Version Control Systems,简称 CVCS )。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法(见下图1)。
这种系统最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端偶然提取出来的保存在本地的某些快照数据就成了恢复数据的希望。但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
分布式版本控制系统
分布式版本控制系统( Distributed Version Control System,简称 DVCS )会把服务器上的代码仓库完整地镜像(复制)下来。这样每个人的电脑上都有一份完成的服务器代码仓库的镜像,任何一处协同工作用的服务器发生故障,事后都可以用个人的电脑上的镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份(见下图2)。我们可以看到电脑A与电脑B与服务器上的版本内容完全一致
2.2版本存储方式的差异:直接记录快照,而非差异比较
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等)每次记录有哪些文件更新,以及都更新了哪些行的什么内容,请看下图。
其他系统在每个版本中记录着各个文件的具体差异
Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像图 4 所示。
Git 保存每次更新时的文件快照
2.3近乎所有操作都是本地执行
在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。
举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。
用 CVCS 的话,没有网络或者断开 VPN 你就无法做任何事情。但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库。同样,在回家的路上,不用连接 VPN 你也可以继续工作。换作其他版本控制系统,这么做几乎不可能,抑或非常麻烦。比如 Perforce,如果不连到服务器,几乎什么都做不了(默认无法发出命令 p4 edit file 开始编辑文件,因为 Perforce 需要联网通知系统声明该文件正在被谁修订。但实际上手工修改文件权限可以绕过这个限制,只是完成后还是无法提交更新。);如果是 Subversion 或 CVS,虽然可以编辑文件,但无法提交更新,因为数据库在网络上。
3.Git的安装
Git支持Linux、Windows和Mac系统,安装Git,可以到Git官方网站直接下载安装程序。
上述步骤后在桌面点击鼠标右键,出现下图即为安装成功
4.Git仓库的基本概念和流程
什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。
4.1git仓库的基本概念
1.远程仓库(Remote):也叫作资源库,是远程机器上的代码库,用于做不同版本库文件交换更新。如Gitlab,GitHub,gitee。
2.本地库(Repository):是用户在本地创建的目录,拥有远程库的一个快照,由工作区和版本库构成。
- 工作区(Workspace):本地库的根目录中除.git目录以外的内容,存储内容的实际文件。
- 暂存区(stage/Index):也叫做缓存区,暂存信息存放在.git目录"下的index文件(.git/index)中,用于临时保存内容的修改;
- 版本库(.git目录):是本地库的根目录中的一个隐藏目录.git,用于记录版本信息,Git进行版本控制所需要的文件,则都放在.git文件夹中;
3.分支(Branch):本地库中默认创建一个主(master)分支,分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作,在最后才会合并到一起。
本地库和远程库的关系:
开发人员通过Git命令来管理代码,最常用的6个命令如下图所示:
4.2git仓库的工作流程
从一般开发者的角度来看,使用Git的工作流程是:
1.克隆远程库:从远程库上克隆完整的Git仓库(包括代码和版本信息)到本地;
2.在本地库上修改代码:在本地库上根据不同的开发目的,创建分支,修改代码;
3.提交到分支:在本地分支上提交代码;
4.把修改合并到本地主分支:在本地库上提交更新,也就是说,把修改合并到本地主分支;
5.把远程库合并到本地主分支:把远程库上的最新代码fetch下来,跟本地主分支合并,如果存在冲突,那么解决冲突。
6.把本地主分支提交到远程库:生成补丁(patch),把补丁发送给远程库。