版本控制系统(VCS)的发展和历史
版本控制系统的发展可以分成三个阶段:
本地版本控制系统:
集中化的版本控制系统(Centralized Version Control System):
分布式的版本控制系统(Distributed Version Control System):
集中化的版本控制系统的代表就是: CVS, Subversion.集中化的版本控制系统的特点就是,有一个统一的版本管理服务器,对文件进行版本管理。但是这种管理方式,所带来的问题就是如果这台服务器发生宕机,那么所有人都无法提交或更新本地工作。甚至如果没有及时对该服务器上的版本数据进行备份,一旦磁盘发生损毁,将会造成灾难性的后果。
而分布式的版本管理工具正解决了这种问题。其中最具有代表性的就是git。客户端并不提取最新版本的文件快照,而是将代码仓库完整的镜像下来。这样,即使服务器出现问题,也都可以利用任意一台客户端的对服务器进行恢复。
git基本工作原理
类似于Subversion存储每个文件与上一个版本之间的差异。
而git则是通过记录当前工作目录的快照的方式进行版本管理。每次提交时,git都是通过制作当前工作目录中的所有文件的快照,并保存指向这个快照的索引。
那么git是如何保证数据完整性的呢?
git在每次存储钱都会计算文件的校验和,使用的是SHA-1散列,计算文件的哈希值。事实上,git数据库中保存的所有信息,都是通过文件内容的哈希值进行索引的。
除了以上关于git的基本信息,你还需要知道,git是如何维护你的本地版本库的。
如下图总所示,git在本地工作空间维护着”三棵树”,他们分别指向你的工作目录(work directory),add后的缓存区(staged)以及提交后的HEAD区。分别也就对应着文件的三种状态:已修改(modified)或可称为未跟踪的文件(untracked),已暂存(staged),已提交(committed).
git基本命令
先看下git下文件的生命周期:
git的每一次操作,都会导致文件生命周期状态的改变。
检查当前文件状态
git status
新添加的readme文件,在没有执行git add前,会以untracked files的状态存在。
跟踪新文件
git的安装和配置
Windows下安装配置
github上已经有了名为msysGit的项目提供了安装包,可以到github的页面上下载exe文件并安装。
http://msysgit.github.com/
- 创建新仓库:git init
- 执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/reposity
- 如果是远程服务器上的仓库,命令如下:git clone username@host:/path/to/reposity
你的本地仓库由git维护的三棵”树”组成。
第一个是你的工作目录:它持有实际文件
第二个是缓存区(index),它像个缓存区域,临时保存你的改动
最后是HEAD,指向你最后一次提交后的结果
添加与提交:
可以将计划的改动,添加到缓存区,使用如下命令:git add 或 git add *
使用commit命令将处于缓存区的改动提交到HEAD区, 如下命令: git commit -m “代码提交信息”推送改动
处于HEAD中的改动,通过push可以提交到远程仓库:git push origin master,这里可以把master换成你想推送的任何分支
如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,可以使用如下命令:git remote add origin
分支
分支是用来将特性开发绝缘开来。
在你创建仓库的时候,master是默认的。
在其他分支上进行开发,完成后再将他们合并到主分支上。
使用checkout切换分支:
创建一个“feature_x”的分支,并切换过去:git checkout -b feature_x
切换回主分支: git checkout master
删除分支: git branch -d feature_x
更新与合并
- 要更新你的本地仓库到最新版,执行: git pull,从而在你的工作目录中获取(fetch)并合并(merge)远端的改动
- 要合并其他分支到你的当前分支,执行: git merge
以上两种情况,git都会尝试去自动合并改动,当合并的过程中发生冲突(conficts)时,可以通过命令:git diff
处理完冲突后,需要执行git add 进行提交