版本控制是一种记录文件内容变化,方便以后查阅特定版本修改情况的系统
1:本地版本控制系统
主要是采用简单的数据库来记录文件历次更新的差异
在硬盘上保存文件修订前后的变化
那么,上面这种控制系统,只能在本地使用,怎么能让不同的开发者协同工作呢?
2:集中化的版本控制系统
上面图示,有一个单一的集中管理的服务器,保存了所有文件的修订版本;而需要协同工作的人员通过客户端连接到服务器,可以取出最新的文件或者提交更新等
上面的控制系统有什么优点和缺点呢?
优点
1:可以清楚的看到项目中其他人员在做什么
2:可以掌控每一个开发者的权限
3:管理一个CVCS比在客户端上面维护本地的数据库要容易
缺点
1:中央服务器的单点故障,一旦服务器出现问题,那么客户端就不能再进行更新提交操作了
2:数据存储在磁盘上,磁盘发生损坏,就可能丢失所有数据
3:分布式版本控制系统
客户端的每次克隆操作,都是对代码仓库的完整备份,不只是提取最新版本的文件快照,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像的本地仓库恢复
优点:
1:可以指定和若干个不同的远端代码仓库进行交互
2:可以在同一个项目中,分别和不同小组的人进行协作
3:可以根据需要设置不同的协作流程
Git的设计目标:
1:速度
2:简单的设计
3:对非线性开发模式的支持:需要上万个并行开发分支
4:完全的分布式
5:能够高效管理超大规模的项目
Git的安装比较简单,可以到官网进行下载安装包,官网地址:Git下载,或者到我这里面的地址进行下载:链接:https://share.weiyun.com/MUODHd1a 密码:kqr43s
Git的使用方式有下面两种,具体的使用方式可自行百度查阅
1:直接记录快照,而不是文件的差异比较
CVS、SVN等大部分系统是用文件变更列表的方式来存储信息,将保存的信息看做是一组基本文件和每个文件随时间变化而累积的差异
上图是一个简单的例子:存储的是每个文件与初始的版本差异;比如File 1,有两个更新后的版本,在数据库中记录的是与Version 1的差异
Git把数据看做是对小型文件系统的一组快照:
1:当文件发生变化的时候,会对全部文件制作一个快照并且保存这个快照的索引
2:当文件没有变化时,会保留一个链接指向之前存储的文件
2:几乎所有操作都是本地执行
由于是做了快照,所以大部分操作都只需要访问本地文件和资源
在本地的磁盘上就有项目的完成历史,操作比较快,而且浏览项目的历史更新记录,不需要连接到服务器去获取历史
在没有网络的情况下,也可以进行提交,有网络再进行上传
3:保证完整性
Git中所有数据在存储前都会计算检验和(校验和百度百科),然后以校验和来引用,不可能在Git不知道的情况下更改任何文件内容和目录内容,Git使用的是SHA-1散列方式计算校验和
Git 数据库中保存的信息都是以文件内容的哈希值来索引
4:一般只添加数据
Git操作几乎只向Git数据库中增加数据,很难执行不可逆操作
没有提交的数据有可能丢失或者弄乱修改的内容,比如常见的文件冲突
但是一旦提交快照到Git中,就很难再丢失了,如果还把数据推送到其他仓库中,那数据就更加安全了
5:Git的三种状态
一:已提交(committed):数据已经安全的保存在本地数据库中了
二:已修改(modified):修改了文件,但是还没有保存到数据库
三:已暂存(staged):对一个已经修改的文件的当前版本做了标记,使它会包含在下次提交的快照中
1:Git项目的三个工作区域
Git仓库:保存项目的元数据和对象数据库的地方,远程克隆仓库就是指这里的数据
工作目录:对项目的某一个版本从仓库中独立提取出来的内容,放在磁盘中供我们使用和修改
暂存区域:暂存区域是一个文件,保存了下一次将要提交的文件列表信息,一般是在Git的仓库中
1:在工作目录中修改文件
2:暂存文件,将文件的快照放入暂存区域
3:提交更新,找到暂存区域中的文件,将快照永久的存储到Git的仓库目录
功能 | Git | SVN |
---|---|---|
分布式 | √ | × |
数据存储方式 | 按照元数据方式存储 | 按照文件 |
分支 | 一个指针标记 | 另外的一个目录 |
全局版本号 | 代码快照,SHA-1来唯一的标识 | 任何一个相应时间的源代码快照 |
内容完整性 | 使用SHA-1校验和,确保代码内容的完整性 | --- |
网络依赖 | 无需联网,本地就可以操作 | 需要联网才可以提交查看整个版本的控制信息 |
Git的客户端有下面这些:命令行客户端、GUI客户端、TortoiseGit、IDE插件
下面以命令行客户端为例,简单了解下Git的基本使用
通过git config工具,可以定制自己的Git环境,每一台计算机都只需要配置一次即可,配置有三个维度:用户、全局、系统
1:用户信息
git config --global user.name "mike"
git config --global user.email mike@email.com
git config --global --unset user.name
2:文本编辑器
git config --global core.editor emacs
3:检查配置信息
git config --list
1:通过命令git init创建全新的Git仓库
2:克隆现有的仓库
Git克隆的是Git仓库服务器上的几乎所有的数据,而不仅仅是复制完成我们工作所需要的文件
1:提交更新
工作目录下的每个文件有两种状态:已跟踪和未跟踪
现在在刚刚创建的仓库下建一个txt文件:
可以想到,新建的一个文件是未跟踪状态:
通过git status可以查看工作目录的状态
使用git add命令操作已跟踪,把文件放入暂存区:
可以看到,文件发生了变化,有了一个图标
git commit建立快照把文件放入存储区:
现在文件是已经提交上去了,然后修改文件,把文件变成已修改状态:
下面图示整个过程:
2:查询提交历史
git log查看所有的commit记录
git show查看提交的详情
3:撤销更新
git checkout -- filename来撤销修改
4:打标签
git tag tagName可以新建标签
git tag命令可以列出所有的标签
这里只列出了一些简单的操作和使用,还有其他的一些使用,可以到Git官网或者百度查询了解,官网地址:Git官网