一、SVN
1、定义
Apache Subversion 通常被缩写成 SVN,是一个开源的集中式版本控制系统,依照时间跟踪目录的变化,保存每次提交的记录。
2、相关概念
-
repository(源代码库): 源代码统一存放的远程仓库;
-
Checkout(提取,检出): 将远程仓库的代码检出到本地临时工作区;
-
Commit(提交): 临时工作区修改了代码,需要Commit到repository;
-
Update (更新): 通过更新让本地与Repository上的源代码同步;
-
分支(branch):开发进程分开成两条不同的线路,可以在两个不同的分支开发,之后合并即可;
-
标签(tag):用于项目开发中的里程碑;
3、特点
- 原子提交:每次提交不管是单个还是多个文件,都是作为一个整体提交的。在这当中发生的意外例如传输中断,不会引起数据库的不完整和数据损坏。
- 分支的开销非常小: 建立分支与标签的方法, 就只是复制该项目, 使用的方法就类似于硬连接(hard-link)。
- 使用二进制差异算法来表示文件的差异。
- 管理源代码是以行为单位的。只要两个提交者不是修改同一行,SVN都会自动合并;如果是同一行,SVN 会提示文件 Conflict, 需要手动解决。
4、使用指南
版本使用过程:
分支使用过程:
标签使用过程:
查看历史信息
- svn log: 用来展示svn 的版本作者、日期、路径;
- svn diff: 用来显示特定修改的行级详细信息;
- svn cat: 取得在特定版本的某文件显示在当前屏幕;
- svn list: 显示一个目录或某一版本存在的文件。
- 详细使用
二、git
1、定义
开源的分布式版本控制系统,也属于内容管理系统。
2、相关概念
- 工作区(Workspace)是电脑中实际的目录。
- 暂存区(Index,又称stage)类似于缓存区域,临时保存你的改动。
- 仓库区(Repository),分为本地仓库和远程仓库。
- 分支(branch):指向一条commit对象链或一条工作记录线的指针,HEAD是一个始终指向当前分支的指针;
从图中可以看到每一次提交的对象内都会保存上一次提交的commit id,由此可以从后往前把所有的提交(commit)串起来形成一条链(类似单向链表),这条链就组成了一条完整的分支信息。
- 标签(tag):标签与分支十分相似,都是指向某一次提交;并且,它们的值都为各自指向提交的SHA1值;但是,不同于会随着提交的变化而变化的分支,一旦给某次提交添加了标签,该标签就永远不会发生变化。
**注意:**标签标识的是某一次提交,提交可以是任何分支上的任何一次提交。 更多内容可阅读git 详细文档
3、特点
- 通过git提供的.gitignore文件配置不被git跟踪的文件,被添加到.gitignore文件中的文件名,将不会被git追踪。
- 工作区中的文件只要通过git add命令添加进了Git仓库,就会被追踪。就算后面在.gitignore添加了不别追踪的内容,该文件也仍然会变追踪。
4、使用指南
仓库使用过程:
分支使用过程:
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。即每次切换分支时,本地工作区将会实时切换并显示该分支最后一次提交的代码。将一个分支的修改同步到另一个分支,可先将分支一提交,接着切换到分支二,执行git merge 分支一后提交代码即可。
标签使用过程:
- 为当前的提交打标签:git tag -a v1.0
- 为历史的提交追加标签:git tag -a v1.0 85fc7e7(即提交ID)
查看历史信息
- git log - 查看历史提交记录。
三、SVN 和 git的比较
1、GIT是分布式的,而SVN是集中式的:Git支持离线工作,在本地可以进行很多操作,而SVN需要联网。
2、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
3、GIT分支和SVN的分支不同:Git 分支是指针指向某次提交,而SVN分支是拷贝的目录。
4、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
5、GIT不像SVN一样有个中心服务器,需要将数据放到一台其他开发人员能够连接的服务器上如GitHub(国外)、Gitee(国内),上面托管的项目即远程仓库;同时注意本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,需要配置验证信息。