了解Git,这一篇就够了
作为一个7年经验的程序员,不该来总结这么基础的东西。但是人总是在高估自己的水平,本周在做一个代码集成的工作时,在git上犯了迷糊,导致很简单的集成,愣是做了两天,费劲不说,还浪费时间。思考了下,根本原因还是基础不牢。在一个行业做上7年,基本上应该是资深了吧?但是细节上到底能深究多少呢?所以还是脚踏实地的来。不在乎基础不基础了,开始吧!把喜欢的事情做到极致,便能产生价值。
0. 前序
版本控制
什么是版本控制呢?官方话是这样说的:版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。
如果项目一个人一气呵成,并且不需要迭代的话,也不需要什么版本控制了,但是这是不可能的。其实版本控制是在时间维度上实现代码迭代的可追溯性,空间上多人协作,实现代码质量的并行管理。

git正是一种版本控制系统。
1.git 介绍
版本控制系统大的维度上可分为两种:一种是分布式,一种是中心式;
git是分布式的结构,另一个系统SVN则是中心式;
中心式结构的版本控制系统是只有一个中心,这个“中心”就是一个特别的服务器,它是一个中央仓库,每个开发者从这个中央仓库下载最新版的项目到本地、然后开发、然后上传给中央仓库。
中心式系统特别依赖这个中心,如果本地与中心的连接出问题、或中心本身出了问题,都可能影响到项目开发。而 Git 理论上是没有中心的,每一个设备都有本地仓库,任何一个设备的本地仓库出问题对其他设备都没有影响。而且,每一个设备都可以创建分支,Git 强大的分支管理也是它的价值所在。

1.1 git的前世今生
讲过故事:
在1991-2002这十余年时间,版本控制软件已经出现,像CVS,SVN等。然而linux之父linus是坚定反对使用CVS和SVN。
2002年到2005年,linus顶着开源社区精英们的口诛笔伐,选择了一个商业版本控制系统BitKeeper作为linux内核的代码管理工具。BitKeeper不同于CVS和SVN等集中式版本控制工具,而是一款分布式版本控制工具。
分布式版本控制系统最大的反传统之处在于,可以不需要集中式的版本库,每个人都工作在通过克隆建立的本地版本库中。也就是说每一个人都拥有一个完整的版本库,查看提交日志,提交、创建里程碑和分支、合并分支、回退等所有操作都直接在本地完成而不需要网络连接。
2005年4月,Andrew Tridgell(Samba的作者)试图对BitKeeper进行反破解,以开发一个能与BitKeeper交互的源码工具。这激怒了BitKeeper软件的所有者BitMover公司,要求回收对linux社区免费试用BitKeeper的授权。
迫不得已,linus选择了自己开发一个分布式的版本控制工具替代BitKeeper。
历时2个多月在linux内核2.6.12发布时,Git诞生了。完成原形设计后,在2005年7月,linus退身,将git的维护交给了一个Git的主要贡献者Junior C Hamano,直到现在。
2.2 git与 SVN对比
前面以了解git是分布式的设计,svn是中心式设计,接下来继续对比两者管理方式的异同。

代码管理:
Git是对分布式管理:
(1)每一个人的电脑都有一个版本库,对网络依赖性不大,因为版本库就在自己电脑上(本地库)。
(2)中央服务器是用来交换大家修改的内容(远程库)
(3)即使中央服务器宕机了,也可以立即从本地库中恢复代码。

SVN是集中式管理:
(1)版本库是集中式存放在中央服务器的,每次必须联网获取新的代码,工作完成之后再推送到中央服务器。
(2)这个的弊端就是必须联网,局域网内还可以,如果是互联网的话,在带宽不够的情况下上传一份大文件,就会很慢,体验很差。

存储方式:


2.git 架构
采用分布式的架构。
3.git 的基本使用
git clone 拉取代码
1 git clone 2 if [ $? –ne 0 ] || return 3
git clone if [ $? –ne 0 ] || return
4.git 安装
4.1 包的下载
4.2 解压
4.3 安装
4.3.1 make
4.3.2 make install
.main-context .second-nume {
width: 680px;
height: 458px;
background-color: white;
position: absolute;
top: 0;
left: 190px;
padding-left: 20px;
display: none;
}1 .main-context .second-nume dl { 2 width: 670px; 3 height: 36px; 4 line-height: 36px; 5 margin-right: 10px; 6 } 7 8 .main-context .second-nume dt { 9 float: left; 10 width: 70px; 11 height: 20px; 12 font-weight: bold; 13 }
