——简单的对照
SVN的工作机制在某种程度上就像一颗正在生长的树:
- 一颗有树干和很多分支的树
- 分支从树干生长出来。而且细的分支从相对较粗的树干中长出
- 一棵树能够仅仅有树干没有分支(可是这样的情况不会持续非常久。随着树的成长,肯定会有分支啦。^^)
- 一颗没有树干可是有非常多分支的树看起来更像是地板上的一捆树枝
- 假设树干患病了,终于分支也会受到影响,然后整棵树就会死亡
- 假设分支患病了。你能够剪掉它,然后其它分支还会生长出来的哦!
- 假设分支生长太快了,对于树干它可能会非常沉重,最后整棵树会垮塌掉
- 当你感觉你的树、树干或者是分支看起来非常美丽的时候,你能够给它照张相。这样就就能够记得它在那时是多么的赞。
——Trunk
Trunk是放置稳定代码的主要环境,就好像一个汽车工厂,负责将成品的汽车零件组装在一起。
下面内容将告诉你怎样使用SVN trunk:
-
除非你必须处理一些easy且能迅速解决的BUG,或者你必须加入一些无关逻辑的文件(比方媒体文件:图像,视频,CSS等等),否则永远 不要在trunk直接做开发
-
不要由于特殊的需求而去对先前的版本号做太大的改变,怎样相关的情况都意味着须要建立一个branch(例如以下所述)
-
不要提交一些可能破坏trunk的内容。比如从branch合并
-
假设你在某些时候偶然间破坏了trunk。bring some cake the next day (”with great responsibilities come… huge cakes”)
——Branches
一个branch就是从一个SVN仓库中的子树所作的一份普通拷贝。通常情况它的工作类似与UNIX系统上的符号链接。可是你一旦在一个SVN branch里改动了一些文件,而且这些被改动的文件从拷贝过来的源文件独立发展,就不能这么觉得了。
当一个branch完毕了。而且觉得它足够稳定的时
候,它必须合并回它原来的拷贝的地方,也就是说:假设原来是从trunk中拷贝的。就应该回到trunk去,或者合并回它原来拷贝的父级branch。
下面内容将告诉你怎样使用SVN branches:
-
假设你须要改动你的应用程序。或者为它开发一个新的特性,请从trunk中创建一个新的branch,然后基于这个新的分支进行开发
-
除非是由于必须从一个branch中创建一个新的子branch。否则新的branch必须从trunk创建
-
当你创建了一个新branch,你应当马上切换过去。假设你没有这么做,那你为什么要在最初的地方创建这个分支呢?
——Tags
从表面上看,SVN branches和SVN tags没有什么区别。可是从概念上来说。它们有很多区别。事实上一个SVN tags就是上文所述的“为这棵树照张相”:一个trunk或者一个branch修订版的命名快照。
下面内容将告诉你怎样使用SVN tags:
-
作为一个开发人员,永远不要切换至、取出,或者向一个SVN tag提交不论什么内容:一个tag好比某种“照片”。并非实实在在的东西,tags仅仅可读。不可写。
-
在特殊或者须要特别注意的环境中,如:生产环境(production)、?(staging)、測试环境(testing)等等,仅仅 能从一个修复过的(fixed)tag中checkout和update,永远不要commit至一个tag。
-
对于上述提及到的环境,能够创建例如以下的tags:“production”,“staging”。“testing”等等。你也能够根 据软件版本号、项目的成熟程度来命名tag:“1.0.3”,“stable”,“latest”等等。
-
当trunk已经稳定,而且能够对外公布,也要对应地又一次创建tags,然后再更新相关的环境(production, staging, etc)
——工作流例子
如果你必须加入了一个特性至一个项目,且这个项目是受版本号控制的,你差点儿相同须要完毕例如以下几个步骤:
-
使用SVN checkout或者SVN switch从这个项目的trunk获得一个新的工作拷贝(branch)
-
使用SVN切换至新的branch
-
完毕新特性的开发(当然,要做足够的測试,包含在開始编码前)
-
一旦这个特性完毕而且稳定(已提交)。并经过你的同事们确认,切换至trunk
-
合并你的分支至你的工作拷贝(trunk),而且解决一系列的冲突
-
又一次检查合并后的代码
-
假设可能的话。麻烦你的同事对你所编写、更改的代码进行一次复查(review)
-
提交合并后的工作拷贝至trunk
-
假设某些部署须要特殊的环境(生成环境等等)。请更新相关的tag至你刚刚提交到trunk的修订版本号
-
使用SVN update部署至相关环境