关于版本控制
什么是版本控制?为什么要版本控制?
版本控制是记录文件内容变化,以便在将来查阅特定版本的系统.有了版本控制,我们就可以将某个文件或是整个项目回退到之前的某个时间段,查看现在和之前相比项目所有的变化,甚至比较文件的变化细节.
本地版本控制
最简单的版本控制就是本地版本控制,我们可以复制一份当前的工作,并在备份上修改做增添新的内容.对单个或几个文件来说这样做是很简单的,但对大的项目就无能为力了.
还有一种流行的一种叫做 rcs,现今许多计算机系统上都还看得到它的踪影。甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。
集中化的版本控制系统
本地版本控制最大的问题就是不能多开发者协作.于是有个集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS ),例如CVS.
所有人的工作都上传到服务器,服务器保存版本更改,而人们同样通过下载来获取最新的更新.
这样做最大的问题是,所有的数据,历史记录都只保存在中央服务器上,如果中央服务器出问题,人们就没法上传下载,即便客户端有当前最新项目的备份,历史更新记录也会丢失.
分布式版本控制系统
为了解决上面提到的问题,人们又发明了分布式版本控制系统(Distributed Version Control System,简称 DVCS).例如Git,客户端并不只是提取最新版本的文件,而是完成的镜像代码仓库.这样一来,客户端和服务器只是担任的功能不同,保存的文件是完全一样的,如果服务器出现故障,客户端仍保存完整的文件和历史记录.
Git基础知识
Git和其他版本控制系统的差别
传统的CVS的版本控制系统每次更新时会记录哪些文件做了更新,以及更新了什么内容,如下图:
而Git并不会保存差异数据(Δ),而是直接记录文件的快照.当提交更新时,Git会总览所有文件的指纹信息,如果文件有更新就会做一个快照并保存一个指向快照的索引,因此Git更像一个微型的文件系统.为了提高性能,若文件没有变化,Git不会再次保存而是做一个对上次保存的快照的链接.如下图:
近乎所有操作都在本地执行
由于Git在本地保存了完整的仓库,因此Git中的大多数操作都是无需联网的,除非你需要多人合作,而CVCS差不多所有的操作都需要连接互联网,因此你必须把自己的改变上传到云端。因此Git会比CVCS快很多。
举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。
用Git你可以在没有网络的时候提交更新,等到了有网络的时候再上传到远程仓库,换做其他版本控制系统,这几乎是不可能的。
保持数据完整性
在保存到Git之前,所有的数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的 唯一标识 和索引。这项特性作为Git的设计哲学,建在整体架构的最底层。因此Git可以非常容易的发现文件传输时的不完整或是磁盘损坏导致的文件数据缺失。
Git使用SHA-1算法计算数据的校验和,通过对文件的内容或目录结构计算出一个哈希值,由40位16进制字符组成,看起来就是:
24b9da6552252987aa493b52f8696cd6d3b00373
Git的工作完全依赖这类指纹字串。实际上,所有保存在Git数据库中的东西都是以哈希值来索引的,而不是文件名。
文件的三种状态
对于任何一个文件,在Git内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged).
已修改 表示文件已被修改,但还没有提交保存;
已暂存 表示已将修改后的文件放在待提交的清单中;
已提交 表示文件已被安全的保存在本地数据库中了;
下图从左到右标识了文件流转的三个区域:工作目录、暂存区、Git仓库目录
每个项目都有一个Git目录,通常是.git目录,它是保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从项目中取出某个版本的所有文件和目录,用以开始后续的工作的叫做工作目录。实际上是从.git目录的压缩对象数据库中提取出来的。
暂存区只是一个简单的文件,一般存放在Git目录中,有时候人们也叫它索引文件。
初次运行Git前的配置
环境变量位置
Git提供了git config命令来配置和读取相应的工作环境变量,Git中的变量可以存取在以下三个不同的地方。
/etc/gitconfig
文件:对所有用户都生效的配置,在使用git config
时用--system
选项,读写的就是这个文件。~/.gitconfig
文件:只对当前用户生效,在使用git config
时用--global
选项,读写的就是这个文件。- 工作目录中的
git/config
文件:仅对当前项目生效。每一个级别的配置都会覆盖上层相同的配置,所以.git/config
里的配置会覆盖系统和用户配置文件中的同名变量。
用户信息
使用Git首先要配置的就是你的用户名和电子邮件地址。
git config --global user.name lepecoder
git config --global user.email example@exalple.com
默认文本编辑器
Git有时需要你输入一些额外的信息,这时就会调用外部编辑器,一般是vi或vim,如果有特殊的需求,也可以自己设定:
git config --global core.editor emacs
指定差异分析工具
可以指定在合并冲突时使用哪种差异分析工具,Git可以理解kdiff3,tkdiff,meldm,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,opendiff等,比如我们要改用vimdiff。
git config --global merge.tool vimdiff
查看配置信息
可以使用git config --list
命令查看配置信息,如果有重复的变量名,表示他们来自不同的配置文件,Git实际使用时会采用最后一个。
$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
.....
也可以直接看某个变量的值
$ git config user.name
lepecoder
基本的Git工作流程是
- 在工作目录中修改某些文件。
- 对修改后的文件进行快照,保存到暂存区。
- 提交更新,将暂存区的快照永久转储到Git目录中。