Intro
版本控制系统是什么
版本控制系统(Version Control System,VCS)可以帮助我们记录和跟踪项目中各文件内容的修改变化。它可以帮我们保存项目的各个版本,以及修改原因,我们可以借用此工具回到项目曾经的某个状态。除此之外,版本控制系统也是帮助人员进行协作开发的利器。
Git是什么
Git是一个分布式版本控制系统(Distributed Version Control System,DVCS)。与传统的集中式版本控制系统(如CVS、Subversion和ClearCase)相比,Git具有以下优势:
- 分布式体系结构:可以完全断网工作,不受网络连接的限制
- 分支与合并操作很容易:创建分支简单、经济、快速,这与其他版本控制系统不一样。Git把分支上所有修改合并回父分支,即使多次,也只是一眨眼的功夫
- 跟Subversion进行交互:Git可以从SubVersion的版本库中导入所有的历史,并把你在Git中的改动发送回Subversion的版本库
版本库
版本库(Repository)是版本控制系统用来存储所有历史数据的地方。大多数版本控制系统在版本库中存储各个文件的当前状态、历史修改时间、谁做的修改、以及修改的原因、还有修改的内容。
常见的版本控制系统可以分为两种类型。一种是集中式版本库(Centralized Repository),所有的程序员都会把他们的改动提交到服务器上的一个公共版本库。具体来说,每一个程序员在本地有一个工作目录树,其内容是该版本库中最新的代码。当他们在工作目录树中完成代码的修改后,就把改动提交回该版本库中。这种方式有一定局限性,在本地工作目录树中,只能看到代码的最新版本。如果想查询历史修改记录,就必须与服务器上的版本库打交道,就必须要使用网络。如果没有网络,也无法记录当前已修改后的项目版本。
另一种就是分布式版本库(Distributed Repository)。使用分布式版本控制系统,在本地就有自己的版本库,所有的历史记录都会记录在本地的版本库中,提交代码的时候不用连接到远程版本库,而是记录在本地的版本库中。git就是这样的一种版本控制系统。那么git是怎样将本地的修改上传到项目的主版本库中的呢?有两种方式:1.
通过push操作直接把修改上传到主版本库。2.生成包含少量修改的补丁包,把补丁包提交给项目维护人员,再由他更新主版本库。
工作目录树
工作目录树是版本库的一个"断面视图"。它包括了开发该项目所需要的全部文件,包括源代码文件、构建文件、单元测试文件等。
在Git中,版本库不在服务器上,而存储在本地工作目录树中的".git"目录中。工作目录树是怎么创建出来的呢?有两种方法。1. 用Git相关的命令初始化版本库,也就是生成".git"目录,于是".git"目录的父目录就成了工作目录树。2. 克隆(Clone)一个已有的版本库,也就连带创建了相应的工作目录树。
克隆一个已有的版本库,就是创建该版本库的一个拷贝,并把版本库中主分支(Master Branch)的内容检出(check out)到工作目录树。在Git中,检出是指把工作目录树更新,并使其内容与版本库中某个特定的历史版本相同。
代码修改与文件同步
代码在修改之后,需要提交(commit)这些改动。每次提交操作都使得版本库中新增一个版本(Revision)。除了记录改动内容本身外,版本库还记录改动的日志信息(log
message)或称提交留言(commit message),这是代码的变动原因。
我们在开发的过程中,有时需要将本地的改动共享。为此,需要把变动推入(push)上游版本库(upstream repository)。上游版本库是一个公共版本库。
与push相反,我们也应该能够把公共版本库中内容取到本地版本库中来。需要两步操作。第一步,把改动取来(Fetch),把远程版本库中的版本和分支复制到本地版本库中。第二步,在本地版本库中,把从远程版本库里取来的改动与自己本地的改动合并(Merge)。一般来说,取来操作和合并操作总是先后执行的。因此,在Git中可以用一个命令完成这两步操作:拖入(Pull)。
标签
标签以一个简单的名称(即标签名)来标记版本库历史中某个特定的点。它可以是一个重要的里程碑,比如对外正式发布的版本;也可以是相对普通的时间点,比如在修复一个缺陷后打个标签。
本质上,标签是一个对于使用者来说易于理解易于记忆的名字,用来标识版本库中一个难读难记的内部版本号,以此帮助使用者跟踪版本历史。
分支
使用分支(branche)可以使你的项目有多条路径可以前进。下图展示了分支原理。主分支(Master Branch)是研发的主线,一些版本控制工具也把主分支称作主干(trunk)。
分支非常自由,分支后面可以合并到主分支上,也可以选择不合并。甚至,你也可以把分支看成是另一个主干,别人可以从你的分支上再拉取一个分支。
合并
合并操作会把两条及两条以上的分支合并到一起。Git会比较各分支上的变化,确定变化在哪里发生、哪个文件的哪个位置,当不同的变化发生在文件的不同部分时,Git能够自动合并。但当发生在同一位置时,就会提示冲突,等待人工介入。而合并的所有操作会被Git所记录下来,便于以后能回归(revert)或者查看。
总结
在本章中,介绍了Git中最核心的几个概念:版本库、版本、分支、合并。版本库是项目的相关内容的容器,而版本是项目在每个时刻下的视图。分支、合并则为团队之间的协作提供支持。