# 1、 版本控制
## 1.1 什么是版本控制
```
版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,
方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术
```
* 实现跨区域多人协同开发
* 追踪和记载一个或者多个文件的历史纪录
* 组织和保护你的源代码和文档
* 统计工作量
* 并行开发、提高开发效率
* 跟踪记录整个软件的开发过程
* 减轻开发人员的负担,节省时间,同时降低认为错误
*****
---->简而言之:用于管理多人协同开发项目的技术
```
没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,
如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安
全性,以及软件的整合等问题。
```
## 1.2常用术语
**1)、仓库(Repository)**
受版本控制的所有文件修订历史的共享数据库
**2)、工作空间(Workspace)**
本地硬盘或Unix 用户帐户上编辑的文件副本
**3)、工作树/区(Working tree)**
工作区中包含了仓库的工作文件。您可以修改的内容和提交更改作为新的提交到仓库。
**4)、暂存区(Staging area)**
暂存区是工作区用来提交更改(commit)前可以暂存工作区的变化。
![](https://box.kancloud.cn/c7fe88de655ee2da10270da9bdf0db48_618x235.png)
**5)、索引(Index)**
索引是暂存区的另一种术语。
**6)、签入(Checkin)**
将新版本复制回仓库
**7)、签出(Checkout)**
从仓库中将文件的最新修订版本复制到工作空间
**8)、提交(Commit)**
对各自文件的工作副本做了更改,并将这些更改提交到仓库
**9)、冲突(Conflict)**
多人对同一文件的工作副本进行更改,并将这些更改提交到仓库
**10)、合并(Merge)**
将某分支上的更改联接到此主干或同为主干的另一个分支
**11)、分支(Branch)**
从主线上分离开的副本,默认分支叫master
**12)、锁(Lock)**
获得修改文件的专有权限。
**13)、头(HEAD)**
头是一个象征性的参考,最常用以指向当前选择的分支。
**14)、修订(Revision)**
表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。
**15)、标记(Tags)**
标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。
## 1.3、常见的版本控制器
主流的版本控制器有如下这些:
* **Git**
* **SVN**(Subversion)
* **CVS**(Concurrent Versions System)
* **VSS**(Micorosoft Visual SourceSafe)
* **TFS**(Team Foundation Server)
* Visual Studio Online
版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN
## 1.4、版本控制分类
### **1.4.1、本地版本控制**
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
![](https://box.kancloud.cn/12302cda61b31f3c0b49a6104a5777ce_400x336.png)
### **1.4.2、集中版本控制**
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改
![](https://box.kancloud.cn/82cc5d0690f5a654fcc1b60cda2262b5_500x392.png)
所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS
注意:必须联网,才能正常使用,要不然看不到版本信息等
### 1.4.3、分布式版本控制
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
![](https://box.kancloud.cn/f21b3b6a514f7896658cce6777ad55bd_500x563.png)
## 1.5、Git与SVN最主要区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。 CVS也是集中式版本控制系统 没有本地库和缓存区
```
**优点:**
1.svn优点:集中式管理,管理方式在服务端配置好,客户端只需要同步提交即可,使用方便,操作简单,很容易就可以上手
2.在服务端统一控制好访问权限,利用代码的安全管理。
3.所有的代码以服务端为准,代码一致性高。
**缺点:**
1.所有操作都需要通过服务端进行同步,这会导致服务器性能要求比较高。如果服务器宕机了就无法提交代码了。**
2.分支管理不灵活,svn分支是一个完整的目录,且这个目录拥有完整的实际文件,这些操作都是在服务端进行同步的,**
不是本 地化操作,如果要删除分支,也是需要将远程的分支进行删除,这会导致大家都得同步
3.需要连网,如果无法连接到服务器就无法提交代码**
```
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
** 集体描述:**
Git 与 SVN 区别点:
1、GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
2.Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网
3、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
4、GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。
5、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
6、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
# 2、git理论基础
## 3.1、工作区域
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
![](https://box.kancloud.cn/0304e9a79baaea2acae04f8a40414f17_318x305.png)
* Workspace:工作区,就是你平时存放项目代码的地方
* Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
* Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
* Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
本地的三个区域确切的说应该是git仓库中HEAD指向的版本
![](https://box.kancloud.cn/0b44cd4e469d939a2b9a5aa44d44d912_818x539.png)
** HEAD **
HEAD:指向最近一次提交后的结果
从git的分支说起,git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针,它保存着一个名为 HEAD 的特别指针。在 git 中,它是一个指向你正在工作中的本地分支的指针,可以将 HEAD 想象为当前分支的别名。
![](https://img.kancloud.cn/9d/c2/9dc212ae840a457bc8bc8157532dfe39_500x287.png)
git log 查看所有提交信息
ls-1 每行列出一个文件,即以单列形式列出。
![](https://img.kancloud.cn/a3/c0/a3c0fe4776a28570ec3539b2f9d616f3_629x182.png)
ls-a 列出所有文件,包括隐藏文件。
![](https://img.kancloud.cn/5d/90/5d900e30b98b2ec790484a63deca286b_634x70.png)
git reset 撤回到指定版本,前面的都会被替换 没有历史可循
git revert 建议一次一次的撤回 追加提交
# 3、git库状态
![](https://img.kancloud.cn/1f/57/1f57555738037c81281c2f52dd354818_800x330.png)
* **Untracked**: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过`git add` 状态变为`Staged`.
* **Unmodify**: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为`Modified`. 如果使用`git rm`移出版本库, 则成为`Untracked`文件
* **Modified**: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过`git add`可进入暂存`staged`状态, 使用`git checkout` 则丢弃修改过, 返回到`unmodify`状态, 这个`git checkout`即从库中取出文件, 覆盖当前修改
* **Staged**: 暂存状态. 执行`git commit`则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为`Unmodify`状态. 执行`git reset HEAD filename`取消暂存, 文件状态为`Modified`
![](https://img.kancloud.cn/c7/73/c77318bed02b635fea0a78caa82c53b6_713x359.png)
- git-第一天
- Git-第二天
- git-第三天
- http-基础
- HTTP构成和状态码
- 浏览器输入URL,经历的过程
- TCP/IP 详解三次握手 四次挥手
- http-DNS系统
- http与https之间的区别
- HTTPS握手和HTTP握手
- HTTP小试牛刀
- Tcp初探
- TCP报文格式
- HTML5
- HTML基础
- Mock
- css 选择器
- css 动画
- css 定位
- position/display/float/z-index第一课时
- 行内、块、脱标 三种状态下的元素如何实现、水平、垂直居中
- clientHeight/offsetHeight/scrollHeight
- js 数据类型
- 变量提升
- 堆栈关系