初学svn
从git转svn真是很不愿意,但是没办法公司代码用svn管理的。以下是我个人对SVN的理解,可能不对的地方会有很多,请指正我们一起学习。
SVN简介
SVN是一个集中式的代码管理工具,这里有SVN教程可参考学习。
基础操作
检出
相当于git上的克隆远程代码到本地
svn checkout https://svn.xxx.com:8443/svn/xxx/xxx/ --username=xxx --password=xxx /Users/xx/Documents/xxx/xxx
svn checkout https://host地址/克隆目录地址 --username=用户名 --password=密码 本地存储路径
检出的时候还可以指定目录检出,分级检出。
提交更改过的代码到服务器
svn status
svn add new.txt
svn commit –m ‘commit’
更新服务器端的代码到本地
svn update
学习笔记
工作流程
日常开发过程其实就是这样的(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) -->作出自己的修改并调试成功 --> Commit(大家就可以看到你的修改了) 。
典型的工作周期是这样的:
-
更新工作拷贝
svn update
-
做出修改
svn add svn delete svn copy svn move
-
检验修改
svn status svn resolved
-
提交修改
svn commit
关于冲突
如果两个程序员同时修改了同一个文件呢, SVN 可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。
解决冲突后需要用
svn resolved xxx.m
这样SVN就知道这个文件不是冲突文件了,会将原来的冲突文件删除保存这个文件。
svn resolved xxx.m
svn commit -m "..."
关于更新版本库
顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。
让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。
此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
关于复查
在 commit 操作之前复查下你的修改是一个很好的习惯。
svn status 查看所有变更的文件列表
svn diff XXX.m 查看某文件的变更记录
Revert 操作
Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。
svn revert xxx.m
svn status时,发现将不该修改的文件修改了,可以通过revert撤回修改
当不小心删除了某个文件时,可以通过svn revert撤回。
回到过去
svn checkout --version 1792 # xxx
回去之后怎么切换回来呢?
关于分支
以下是个人关于SVN分支、合作开发的理解
trunk和branches的存在是合理的,甚至还应该有一个tags专门存储每次的上线版本,trunk是版本主线,branches存放暂存的开发分支。各个开发先在branches创建一个文件夹,作为自己的分支branch-mx,然后从trunk让拷贝一份最新的代码到branch-mx里,在这里修改,修改完后将自己的修改合并到trunk上去。
主目录
|
|-- trunk
|
|-- branches
|
|-- branch-ZhangSan
|
|-- branch-LiSi
- 怎么创建分支?
直接对两个目录进行copy
svn copy -m "Creating a personal branch of ZhangSan" http://svn.example.com/resp/iOS/trunk http://svn.example.com/resp/iOS/branches/branch-zhangsan
创建完分支后,checkout 到自己的分支上开发。
svn checkout http://svn.example.com/resp/iOS/branches/branch-zhangsan
-
怎么合并分支?
//切到主目录 cd ../iOS/trunk/ //更新主线 svn update //将自己分支的修改合并到主线 svn merge --reintegrate http://svn.example.com/resp/iOS/branches/branch-zhangsan //查看合并 svn status / svn diff / ... //提交合并 svn commit -m "..."
注意:以下这个步骤是我个人理解,我也不清楚对不对,网友们有说需要将自己的分支删除,那岂不是每次开发前需要重新创建了,很麻烦。
分支合并到主干后,再次开发前需要将自己分支上的内容更新到最新,然后再开始开发
//进入主trunk目录
cd ../iOS/branches/branch-zhangsan/
//将主目录的文件merge到自己的分支
svn merge --reintegrate http://svn.example.com/resp/iOS/trunk/
切换分支命令
svn switch http://svn.example.com/resp/iOS/branches/branch-zhangsan
查看分支详情
svn info
推荐阅读
这个需要从头到尾看完
SVN菜鸟教程
这看至少前面的几章需要看完
SVN使用教程