SVN教程:https://www.runoob.com/svn/svn-intro.html
1.SVN简介
1.1.什么是SVN ?
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。
互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。
1.2.原理
1.3.工作流程
日常开发过程其实就是这样的(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) -->作出自己的修改并调试成功 --> Commit(大家就可以看到你的修改了) 。
如果两个程序员同时修改了同一个文件呢, SVN 可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。
SVN 的一些概念
- repository(源代码库):源代码统一存放的地方
- Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
- Commit(提交):当你已经修改了代码,你就需要Commit到repository
- Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
1.4.SVN 生命周期
1.4.1.创建版本库
版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。
Create 操作是用来创建一个新的版本库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。
1.4.2.检出(Checkout)
Checkout 操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。
1.4.3.更新(update)
顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。
让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。
此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
1.4.4.执行变更
当检出之后,你就可以做很多操作来执行变更。编辑是最常用的操作。你可以编辑已存在的文件,例如进行文件的添加/删除操作。
你可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit 操作后才会成为版本库的一部分。
同样地你可以删除文件/目录。删除操作立刻将文件从工作副本中删除掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了 commit 操作后才会真正删除。
Rename 操作可以更改文件/目录的名字。"移动"操作用来将文件/目录从一处移动到版本库中的另一处。
1.4.5.复查变化
当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在 commit 操作之前复查下你的修改是一个很好的习惯。
Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status 操作就是用来查看这个待变更列表。
Status 操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用 diff 操作来查看这些变动的详细信息。
1.4.6.修复错误(Revert )
我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。
Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。
1.4.7.解决冲突
合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,"hello.c" 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。
1.4.8.提交更改(Commit)
Commit 操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。
在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。
2.SVN使用说明
2.1.检出项目
假如项目已经在服务器的仓库里,那么现在你要做的就是把它检出到本地。
首先创建一个空文件夹。在空文件夹内右键,选择SVN检出。
现在你看到应该是这个界面,填入版本库地址,选择确定。
如果是第一次登陆,此时会弹出一个对话框让你输入账号密码,输入你的账号密码即可。记得勾选保存认证,不然每次操作都会让你输入。
过几秒就会检出完成
找到目录就可以开始工作了
2.2.导入项目
右键选择版本浏览器
根据自己的项目上传你的文件或者文件夹
选择你的项目或者文件后
确定看到目录完成就行了
但是,不要以为导入成功就可以了。你还得重新检出,重新检出的项目才是受SVN控制的,务必记得检出,如果不检出你操作的属于你没有上传之前的文件,当你下次上传可能会出现问题。
在SVNProject上右键检出到本地,然后在里面进行修改。现在就可以愉快的工作了。
细心的朋友可以发现,检出过后点击文件夹然后右键菜单变成了这样。
这也就是我们接下来要讲的,项目提交流程
2.3.关于项目的提交
绿色表示当前文件没有被修改过(看不见颜色的重启下电脑就好了)。
如果在我的Dome里面对代码进行了修改。你就会发现现在变成了红色,红色表示已修改。
怎么提交修改?在根目录下,右键选择提交。
务必记得输入提交信息(虽然不输入也能提交),提交信息可以方便日后查看。
提交完毕后,可以发现又恢复到了绿色。如果看到还是红色可以退出后在进入就行了。
3.常见操作
视频链接:https://www.bilibili.com/video/BV1k4411m7mP?p=6
一、把SVN上的项目下载到本地? 1.在SVN上创建项目 2.在本地磁盘创建文件夹SVNDemo,执行checkout操作 二、添加文件到项目,提交到SVN上? 把文件复制到SVNDemo中,执行Commit操作,即提交成功。 三、修改文件,提交到SVN上? 修改文件——》SVN commit 四、查看提交的历史记录? showlog——>选中提交的版本,可以看见修改的文件。双击文件,可以看见修改的内容。 无、更新文件? 每次使用前,最好先update. 六、撤销和恢复? (1)撤销本地修改 (2)撤销已提交的内容 (3)恢复到指定版本 (1)撤销本地修改 本地修改的内容,还没有提交的情况 执行SVN revert (2)撤销已提交的内容 当把文件提交到SVN上去了后,发现内容修改错了. 解决办法:先本地撤销到原版本,然后提交。 先本地撤销到原版本:showLog——>选择已提交的错误的版本——>Revert changes from this versio——>Revert 提交:commit (3)恢复到指定版本 之前已经提交过很多次,现在需要恢复到之前的一个版本。 showLog——>指定版本——>Revert changes from this versio——>Revert 七、添加忽略文件? 对于一些不会经常发生改变的文件,可以添加忽略,防止从夫提交。 选中文件——>unreversion and add to ignore list 提交忽略文件 八、撤销忽略文件? 之前把文件添加忽略了,现在不想忽略了。 Remove from ignore list 九、如何解决冲突? 什么情况下容易发生冲突? 多个人修改了相同文件的同一行 无法进行合并的二进制文件(图片) 怎末避免冲突? 经常Update同步他人的代码 二进制文件不要多个人同步操作 分支 什么时候需要需要开分支 隔离线上版本和开发版本 大功能开发,不影响到其他人,自己独立开个分支去开发。 SVN经典目录结构 trunk 主干(开发版本,可上线的) branches 分支(本地版本,常用于bug修复,然后合并到trunk) tags 标签 在SVN中创建代码库时,通常会创建trunk、branches、tags三个子目录,当然,你也可以用其他名称来实现主干和分支的功能 trunk-主干,或称主线,顾名思义,是开发的主线。 branches-分支,是从主线上分出来,独立于主线的另一条线。可以创建多个分支。一个分支总是从主干一个备份开始的,从那里开始,发展自己独有的历史。在版本控制的系统中,我们经常需要对开发周期中的单独生命线作单独的修改,这条单独的开发生命线就可以称为Branches,即分支。分支经常用于添加新的功能以及产品发布后的bug修复等,这样可以不影响主要的产品开发线以及避免编译错误等。当我们添加的新功能完成后可以将其合并到主干中。 tags-标记,主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本。即主干和分支都是用来进行开发,而标记是用来进行阶段发布的。安全公司的配置库有专门的发布区,所以tags并不需要创建,在这里只是提供说明,不推荐使用。 1.分别创建trunk、branches、tages文件夹,把项目拷进trunk目录里,进行commit.远程仓库就会出现这三个目录。 2.选中Trunk文件夹——>Branche/Tag——>选中branches(把上线的版本放到branches中)——》update,就会在branches中看到项目了 主干和分支在修改上项目不影响。 3.若发现主干版本的项目有的地方写错了,可以在branches中进行修改,接着commit. 4.然后合并到trunk中,再提交到远程仓库。选中branches——>showLog——>选中要合并的版本——>Merge revision to(选中trunk中修改的文件),会出现感叹号——>commit(全部变绿)
update 是从SVN服务器上把最新版本下载到本地来;
commit 是将本地做过的改动(修改、新增、删除、改名、移动等)上传更新到SVN服务器;
add 是将本地新增文件或文件夹标注为受SVN控制,但还未上传到服务器,一般后面还会跟一个commit操作。