版本控制系统(Version Control System, VCS)可以帮助我们记录和跟踪项目中各文件内容的修改变化。
分布式版本控制系统(Distributed version control system, DVCS)也是这样,它的主要目标仍然是帮助记录和跟踪项目中所做的修改。而它与传统版本控制系统的区别在于,开发人员相互同步修改内容的方式不同。
版本库 The Repository
版本库(Repository)是版本控制系统用来存储所有历史数据的地方。
大多数版本控制系统在版本库中存储各个文件的当前状态、历史修改时间、谁做的修改,以及修改的原因。
CVS和Subversion这类版本控制系统属于集中式版本库(Centralized Repository)模式。在这种模式下,所有的程序员都会把他们的改动提交到服务器上的一个公共版本库中。在本地工作目录树中,只能看到代码的最新版本,如果想查询历史修改记录,就必须与服务器上的版本库打交道。这就带来一个问题:必须要使用网络。
如果使用分布式版本控制系统,就不会遇到不能上网所带来的问题。
这是以Git为代表的分布式版本控制系统最大的优势。
每个人都会在本地有自己的版本库,而不是连接到服务器上的一个公共的版本库。所有的历史记录都存储在本地的版本库中。
工作目录树 Working Trees
工作目录树是程序员进行程序开发的地方。
在传统的版本控制工具中,工作目录在本地,而版本库在服务器上,而Git中并非如此。
在Git中,版本库不在服务器上,而存储在本地工作目录树的“.git”目录中。
工作目录树最初的创建有两种方法:
1.用Git相关命令初始化版本库,生成“.git”目录,于是“.git”目录的父目录就成了工作目录树。
2.克隆一个已有的版本库,也就连带创建了相应的工作目录树。
代码修改与文件同步 Manipulating Files and Staying in Sync
每次提交(Commit)操作都会使得版本库中新增一个版本(Revision)。
除了记录改动内容本身以外,版本库还记录改动的日志信息(Log Message)或称提交留言(Commit Message)。
使用像Git这样的分布式版本控制系统时,除了把改动提交到本地版本库之外,还要通过某种方式将改动共享,以便其他程序员能够得到。为此,需要把改动推入(Push)到上游版本库(upstream repository),即公共版本库。
推入操作是代码同步的一半,另一半是,必须把别人完成的劳动从公共版本库拿到本地版本库中来。
具体来说,把远程版本库中的改动拿到本地版本库中,需要两步操作:
1.把改动取来(Fetch),把远程版本库中的改动取到本地版本库。
2.将取来的内容和本地改动合并(Merge)。
在Git中,可以用一个命令完成这两个操作:Pull。
使用标签跟踪里程碑 Tracking Milestones with Tags
标签以一个简单的名称(即标签名)来标记版本库历史中某个特定的点。
本质上,标签是一个对于使用者来说易于理解和易于记忆的名字,用来标识版本库中一个难读难记的内部版本号,以此帮助使用者跟踪历史版本。
使用分支来跟踪并行演进 Creating Alternate Histories with Branches
在版本库中创建分支的起点。自此,各路发展平行并进。
每条分支记录这条分支上发生的变更,而与其他分支隔离。
主分支(Master Branch)是研发的主线,一些版本控制工具也把主分支称作主干(trunk)。
分支可以长期存在,也可以仅存在数小时。分支可以合并到其他的分支,但并非所有的分支都必须合并。
合并 Merging
合并操作把两条或者两条以上的分支合并到一起。
Git自动处理分支合并的方法与程序员人工处理的方法是相同的:Git比较各分支上的变化,确定变化在哪里发生——哪个文件的哪个位置。
当不同的变化发生在文件的不同部分时,Git能够自动合并。但
情况并不总是这样理想,当Git不能自动合并时,就会提示冲突(conflict)。
锁机制 Locking Options
严格锁(strict locking):一个时刻,只有一个人可以占用资源。
乐观锁(optimistic locking):允许多个人同时修改同一文件。乐观锁基于一个假定:大多数时候,这种并发修改不会引起冲突。
一些约定
Git 首字母大写表示Git工具本身。
git 表示命令行中的命令。
prompt> 表示需要输入的命令。
基础命令
设置用户名和邮箱:
prompt> git config --global user.name “XXXName”
prompt> git config –global user.email “XXXX@YYY.com”
用下列命令可以检查上述设置是否成功:
prompt> git config --global --list
启动图形界面:
prompt> git-gui
启动gitk:
在工作目录树下prompt> gitk
显示版本库中的历史记录:
prompt> gitk –all
获取Git内置帮助信息:
prompt> git help
prompt> git help <command>
其中,用希望了解的具体命令名称替代<command>
文档中相应命令的页面将会在浏览器中显示出来。
参考资料
《版本控制之道——使用Git》(Pragmatic Version Control Using Git)