一、简介
1️⃣ SVN 是什么?
- 代码版本管理工具
- 他能记住每次的修改
- 查看所有的修改记录
- 恢复到任何历史版本
- 恢复已经删除的文件
2️⃣ SVN 与 Git 相比有什么优势?
- 使用简单、上手快
- 目录级权限控制,企业安全必备
- 子目录 Checkout,减少不必要的文件检出
3️⃣ 主要应用在哪些情况?
- 开发人员用来做代码的版本管理
- 用来存储一些重要的文件,比如合同
- 公司内部文件共享,并能按目录划分权限
4️⃣ 工具推荐
- SVN 仓库、客户端推荐svnbucket SVN桶
- 去官网注册 SVN桶 账号
- 下载 SVN 客户端,此处推荐 TortoiseSVN
二、基本操作
1️⃣ 检出 checkout
- 在SVN桶官网创建一个项目
- 复制我们的项目地址,来到我们本地文件夹中,鼠标右键选择检出
- 输入我们 SVN桶 的账户用户名和密码,检出完成后会显示我们的仓库目录
2️⃣ 新增 add
- 在我们本地仓库里创建一个文件 a.txt
3️⃣ 提交 commit
- 在仓库中鼠标右键,SVN Commit 会弹出提交页面
- 此时在网站中已经可以看到我们提交的内容了
4️⃣ 更新 update
-
右键仓库空白区域,可以通过 SVN Update 更新我们本地仓库
-
修改 a.txt 文件,加入一行内容,然后提交,再提交前我们可以查看提交前后的文件差异
-
然后确定提交
5️⃣ 查看历史记录
- 右键空白区域,
Tortoise -> Show log
可以查看日志
- 使用SVN在每次提交之前先更新一下,这是一个很好的习惯,可以减少冲突
三、撤销恢复
1️⃣ 撤销本地修改
- 先修改我们的 a.txt
- 右键我们的文件 -> 点击 Tortoise -> Revert 【还原】
2️⃣ 撤销已经提交的内容
- 编辑 a.txt 文件,然后提交
- 右键仓库空白区域 -> Tortoise -> Show log -> 点击我们错误提交的那条日志 -> revert change this version 【复原此版本做出的修改】
- 此时我们的 a.txt 文件从之前错误版本恢复到了正常版本,处于修改状态,需要我们提交一下
3️⃣ 恢复到指定的版本
- 我们添加新内容、提交,多重复几次,然后恢复到添加新内容之前的版本
- 我们可以 右键空白区域 -> Tortoise -> Show log -> 选择我们要复原到的那个版本的记录 -> Revert to this version 【复原到此版本】
- 可以看到 a.txt 已经恢复到了我们指定版本的内容,接下来只需要我们提交一下就好了
四、添加忽略
-
当有些文件我们并不想提交到我们的仓库中,我们可以添加忽略
- 创建一个文件b,然后提交到我们的仓库中
- 忽略一个文件的步骤:
-
忽略后的文件上会有一个 x
-
我们提交一下就会删除我们仓库里已经保存的但我们设置为忽略的数据,完成操作后文件不再拥有SVN的状态
-
当我们想取消忽略,我们可以采用添加或从忽略列表删除来实现
五、解决冲突
1️⃣ 什么情况下容易发生冲突?
-
多个人修改了同个文件的同一行
-
无法进行合并的二进制文件 【以修改图片为例】
2️⃣ 怎么避免冲突?
- 经常 update 同步下他人的代码
- 二进制文件不要多个人同时操作
3️⃣ 冲突了怎么办?
- 右键选择冲突解决方式:
- 使用自己的版本、使用对方的版本、手动编辑冲突文件
- 哪边正确就右键选择使用此文本块
- 使用自己的版本、使用对方的版本、手动编辑冲突文件
- 对于二进制的冲突文件,我们需要手动进行选择
六、分支
-
什么时候需要分支?
- 隔离线上版本和开发版本
- 大功能开发,不想影响到其他人,自己独立开个分支去开发
-
SVN经典目录结构:
- trunk: 主干 用于存放一些开发中的文件,开发完成后我们就可以生成一个版本,然后存储到 branches分支中去
- branches:SVN的branches目录是用来保存分支的目录,分支是代码库中的一个独立副本,它可以与主开发线分离并独立发展
- tags:SVN的tag目录是用来保存代码库的某个特定版本的快照副本的目录,通常用于标记代码库中的重要事件或里程碑
1️⃣ 在我们的仓库下创建三个目录 trunk、branches、tag,然后将当前的文件都存储到 trunk 中
2️⃣ 当我们完成了本地开发,想要发布一个线上版本,可以将trunk中的文件生成一个版本存储到 branches 中
输入我们的分支保存地址
我们可以看到 online1.0 已经保存到了我们的 branches 中
3️⃣ 但是随着分支的增加,以后可能要更新的内容也越来越多,所以我们可以把这个分支单独的 checkout(检出)出来
复制SVN的地址
修改文件名并检出到指定目录
检出后的目录结构
4️⃣ 同理我们也把 trunk 也 checkout 出来,然后把包含所有的那个删除,只保留我们线上版本和主线版本
-
我们在主干和分支中修改代码等操作,相互是不影响的
-
如果我们线上版本修改了,我们可以通过分支合并的方式,将线上版本合并到主干上,完成对主干的修改
合并完成之后,我们到主干目录 commit 一次就好了
5️⃣ 我们根据 trunk 分支再创建一个 online2.0 分支出来,我们无需再通过 checkout 获取文件,可以右键 online1.0 进行分支切换
点击 Switch 之后,选择我们想切换到的分支
七、代码暂存
- 代码暂存有什么用?
- 代码改了很多,突然需要修复一个紧急 bug,但是代码还没有写完,不能提交
- 代码重构了很多,突然需要发布新版本,但是代码还跑不起来,不能提交
八、复杂代码合并
-
一般什么情况下才算复杂代码?
- 主干开发新功能,改了很多代码
- 分支是线上版本,修复了很多 bug
- 也就是说两个分支的代码时间久了差异很大,无法直接和并或者指定提交记录合并代码
-
一般我们都会借助 BeyondCompare 工具来完成复杂代码合并工作
-
右键左右两个目录对比后,会将所有存在差异的文件列出来