企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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)