SVN 和 git 学习心得

565 阅读4分钟

一、SVN

1、定义

Apache Subversion 通常被缩写成 SVN,是一个开源的集中式版本控制系统,依照时间跟踪目录的变化,保存每次提交的记录。

2、相关概念

  • repository(源代码库): 源代码统一存放的远程仓库;

  • Checkout(提取,检出): 将远程仓库的代码检出到本地临时工作区;

  • Commit(提交): 临时工作区修改了代码,需要Commit到repository;

  • Update (更新): 通过更新让本地与Repository上的源代码同步;

  • 分支(branch):开发进程分开成两条不同的线路,可以在两个不同的分支开发,之后合并即可;

  • 标签(tag):用于项目开发中的里程碑;

3、特点

  • 原子提交:每次提交不管是单个还是多个文件,都是作为一个整体提交的。在这当中发生的意外例如传输中断,不会引起数据库的不完整和数据损坏。
  • 分支的开销非常小: 建立分支与标签的方法, 就只是复制该项目, 使用的方法就类似于硬连接(hard-link)。
  • 使用二进制差异算法来表示文件的差异。
  • 管理源代码是以行为单位的。只要两个提交者不是修改同一行,SVN都会自动合并;如果是同一行,SVN 会提示文件 Conflict, 需要手动解决。

4、使用指南

版本使用过程:

image.png

分支使用过程:

image.png

标签使用过程:

image.png

查看历史信息

  • svn log: 用来展示svn 的版本作者、日期、路径;
  • svn diff: 用来显示特定修改的行级详细信息;
  • svn cat: 取得在特定版本的某文件显示在当前屏幕;
  • svn list: 显示一个目录或某一版本存在的文件。
  • 详细使用

二、git

1、定义

开源的分布式版本控制系统,也属于内容管理系统。

2、相关概念

  • 工作区(Workspace)是电脑中实际的目录。
  • 暂存区(Index,又称stage)类似于缓存区域,临时保存你的改动。
  • 仓库区(Repository),分为本地仓库和远程仓库。

image.png

  • 分支(branch):指向一条commit对象链或一条工作记录线的指针,HEAD是一个始终指向当前分支的指针;

从图中可以看到每一次提交的对象内都会保存上一次提交的commit id,由此可以从后往前把所有的提交(commit)串起来形成一条链(类似单向链表),这条链就组成了一条完整的分支信息。

  • 标签(tag):标签与分支十分相似,都是指向某一次提交;并且,它们的值都为各自指向提交的SHA1值;但是,不同于会随着提交的变化而变化的分支,一旦给某次提交添加了标签,该标签就永远不会发生变化。

**注意:**标签标识的是某一次提交,提交可以是任何分支上的任何一次提交。 更多内容可阅读git 详细文档

3、特点

  • 通过git提供的.gitignore文件配置不被git跟踪的文件,被添加到.gitignore文件中的文件名,将不会被git追踪。
  • 工作区中的文件只要通过git add命令添加进了Git仓库,就会被追踪。就算后面在.gitignore添加了不别追踪的内容,该文件也仍然会变追踪。

4、使用指南

仓库使用过程: image.png

分支使用过程:

image.png

当你切换分支的时候,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加密的,需要配置验证信息。