用途
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 在本文所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。
几种版本控制系统
本地版本控制系统
最早的版本控制系统是人们将整个文件复制下来再进行修改,后来出现一种流行的版本控制系统叫RCS,工作原理是在硬盘上存储补丁集,通过应用所有的补丁,电脑可以计算出各个版本的文件内容。
集中化的版本控制
该版本控制方法致力于让不同系统上的开发者协同工作。这类控制系统,比如CVS,Subversion,Perforce等,都有一个单一的几种管理的服务器,服务器上保存有所有文件的修订版本。协同工作的人们通过客户端来连接这台服务器,取出最新的文件或者提交更新。
这种版本控制方法的缺点在于如果中央服务器出现故障,则人们将无法协同工作。一旦中心服务器磁盘发生损坏,整个项目就会丢失。(本地版本控制系统也存在如下问题)
分布式版本控制系统(DVCS)
典型的分布式版本控制系统,比如Git,Mercurial,Bazaar,Darcs等,客户端不是仅提取最新版本的文件快照,而是把代码仓库完整的镜像下来,包括历史记录。而且通过这种控制系统,我们可以在同一个项目中,分别和不同的工作小组进行合作。
Git
Git有如下特点:
- 速度
- 简单
- 允许成千上万个并行开发的分支
- 完全分布式
- 有能力高效管理类似Linus内核一样的超大规模项目
下面是对Git的使用介绍
Git不是针对基于差异的版本控制,而是把数据看做是对小型文件系统的一系列文件快照。当我们提交更新时,他就会对当时的全部文件创建一个快照并保存这个快照的索引。为了提高效率,Git不会重新存储没有修改的文件,而是保留一个练级指向之前的存储文件,Git对待数据,更像是一个快照流。
在Git中几乎所有的操作都只需要访问本地文件和资源,一般不需要来自网络上其他计算机的信息。
举个例子,要浏览项目的历史,Git不需要连接到服务器上去获取历史,而是只需在本地进行读取。
同时Git还能保证完整性,Git中所有的数据在存储前都会计算校验和,然后以校验和引用。这意味着不能在Git不知情时更改任何文件内容或目录内容。
Git一般只会向数据库中添加数据,所以几乎不会执行任何删除文件的命令。
每一个文件都可能有三种状态:已修改,已暂存,已提交,分别对应三个目录,工作目录,暂存目录,.git目录。
工作区是某个版本独立提取出来的内容,这些从Git仓库中提取出来的文件,放在磁盘上供我们修改。
暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在Git仓库目录中。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
使用
初始化git
安装git之后首先要设置用户名称和邮件地址。
1
2git config --global user.name "your name"
git config --global user.email "your email@email.com"其次要创建ssh
1
ssh-keygen -t rsa -C "your email@email.com"
创建过程中的每一次交互都按Enter选择默认选项即可。
查看生成的密钥,全选复制,粘贴到代码托管网站用户的(注意不是项目的)公钥管理页面。公钥名称随意。
1
cat ~/.ssh/id_rsa.pub # 查看密钥的命令
检查是否配置成功:
1
2
3ssh -T gitee@gitee.com
# 如果使用的是github
ssh -T git@github.com选择继续连接,如果看到successfully authenticated字样即证明设置成功。通过shell无法访问代码托管网站的提示忽略即可。
从一个空项目开始
在该项目文件夹下执行
git init
命令进行初始化。每一次提交时,执行如下命令:
1
2
3git add --all
git commit -m "priscrition"
git push --set-upstream remote_branch_name local_branch_name如果需要将代码从远程仓库取回,执行如下命令:
1
2
3
4
5
6
7
8# 完整版本 将远程的origin主机上的next分支与本地的master分支合并
git pull origin next:master
# 如果将远程的origin主机的next分支与当前分支合并,则可以省略写作
git pull origin next
# 如果当前分支与远程分支存在追踪关系(--set-upstream),则可以写作
git pull origin
# 如果当前分支只有唯一一个追踪分支,则可以写作
git pull具体查看如下的介绍:git pull 介绍