你使用源码管理工具吗?
2009-11-28 03:59 Tower Joo 阅读(12174) 评论(40) 编辑 收藏 举报你使用源码管理工具吗?
本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛, 出处 ,并且 非商业 .
点击 订阅 来订阅本博客.(推荐使用 google reader, 如果你的浏览器不支持直接订阅,请直接在 google reader 中手动添加).
点击 下载pdf阅读 (如果浏览器不支持直接打开,请点击右键另存)
引入
其实故事是这样的:
上周一个本科的同学来北京出差, 和朋友一起去吃饭, 总共是3个人, 外包公司工作快3年的朋友(简称为A), 北邮研二的研究生朋友(简称为B), 和我. 一个偶然我们提到了技术,提到了源码管理工具, svn, cvs, hg, git 等. 友A有一定的了解, 说他们使用sourcesafe来进行代码管理, 言语中透露出对源码管理工具的不熟悉. 友B竟然没有听过!我一边感慨 国内教育,一边也语重心长地向他极力推荐了源码管理工具.
最近老在想, 为什么北邮的同学计算机专业硕士居然没听说过代码管理工具?作为程序员又有多少没听过没用过呢?
于是有了写这样一篇代码管理工具介绍的文章.
什么是源码管理工具
你用过CVS, SVN吗?你知道分布式的源码管理工具吗?
这里我也就不引用别的定义, 我只想说说我对源码管理工具的认识.
简单地说, 源码管理工具是一种 记录代码更改历史, 可以无限回溯, 用于代码管理,多个程序员开发协作的工具.
常见的功能有:
- 更新到任意一个版本(不用担心代码的修改错误,和丢失等)
- 日志记录(说明修改目的)
- 分支,标签(用于协作开发, 和便于阶段性产品发布)
- 合并,比较(用于多人,多分支之间的代码合并,比对等)
为什么要使用源码管理工具
你可能会想, 需求出来了, 老大把我要做的功能告诉我,我去写代码就行,完事了,我再打包发给他 让他加入到整个代码中,然后测试.有问题再反馈回来,我再修改,再打包.这样不是也挺好吗?
当然我要说,这样当然是可以的,但是如果你们要修改同一个文件怎么办?你们还得事先商量确定 某个时间某个人不能修改等等. 或者新建不同的名字的文件,最后由一个人来合并.
如果你的团队不是3,5个人,而是30,50人呢?你这样的沟通和重复性工作的成本会有多高?
于是聪明的程序员便有了版本控制的设想, 继而有了源码管理工具的不断推陈出新.
如果你稍微开发过一个正式的项目,想必你对 cvs, svn, hg, git 这些也一定 有所耳闻.
下面就简单根据我个人的一些项目经验来介绍下2类的源码管理工具.
源码管理工具介绍
简单地可以将源码管理工具分为两类: svn 这样的集中式的,和 hg 这样的分布式的.
因为我个人对 svn 和 hg 比较熟悉,所以下面就以这二种具体的工具为代表来说明二者的优劣.
第一次接触源码管理工具就是 svn, 想着那时对于什么 增量修改, 历史记录 等概念不清楚时, 也曾在写了2小时的代码后,提交svn时失误而导致文件被删除的悲惨历史. 惨痛的教训让我开始了系统地 学习svn的过程, 一天后,我明白了它的原理, 这时会很晰明确地知道每个命令的结果, 也会很清楚地知道 自己怎样做才是最合适的.
简单总结一些best practice:
- Check in early, Check in often(这个是很重要的,尤其是多个开发的团队,这样可以大大减少冲突的可能)
- 发现冲突第一时间解决(不能将冲突留给你的同事,发现了第一时间解决, 如果需要要向冲突的相关同事沟通交流)
- 只提交需要提交的文件(一些临时文件不要提交,不能污染整个代码库)
- 熟悉常用的命令,如add/rm/up/ci/co/stat/merge/diff等
大致一个月后,我逐渐明白一个源码管理工具对于一个项目的意义和作用. 自此后, 我去公司实习我会第一时间询问 他们是否使用源码管理工具,使用哪种工具. 而对于自己的一些业余项目,我也通常是使用 google code 来管理起来, 甚至当前的这些博客的源码(不过最近已经迁移到了hg的一个hosting service下,原因请参考下文).
到了去年的晚些时候, 开始知道了分布式源码管理工具, 了解了它与集中式工具的区别和优势. 也听到了一个小故事,
说是Linux的作者Linus大牛不满svn, 于是自己花了一周(?抱歉具体时间记不得了)写了个分布式的代码管理工具, 于是就有了大名鼎鼎的git.
我们不去羡慕Linus大牛的英明神武(啊,真是牛啊!), 我们来关心他的作品 分布式代码管理工具. 它与集中式的 究竟有什么区别呢?
每个work copy(也就你自己检出的代码)都具有完整的代码库信息, 这也就是说:
- 对于检出的代码,我们无论是查看log, 提交代码, 或者删除等都是本地的操作,而无需与服务器打交道
- 只有push/pull两个操作(其它的初始化等操作不计入内)与服务器打交道,其它的日常操作都是本地
集中式的版本文件信息(所有的版本文件信息都位于项目根目录下的.hg目录下,而不像svn每个目录下都有一个.svn目录)
简单的忽略文件设置:.ignore文件中可以简单地设置你不希望提交到版本库的文件(支持通配符)
简单地说,我更喜欢hg的原因是,我无需再为了查看log而等半天(与服务器通信), 这样大大地方便了网络不好, 分布式的开发环境.
一些建议
我不说使用了代码管理工具的公司就是好公司,但是我肯定没有使用代码管理工具的公司肯定不是好公司.
同样, 使用了代码管理工具的程序员不一定就是好程序员,但是没有使用代码管理工具的程序员肯定不是好程序员(至少 没有经历过一个真正的多人协作的项目).
以我个人的项目经历,我极力向我的读者建议:
如果你没有使用过代码管理工具,请赶紧去学习一种(个人推荐 hg).
如果你在做一些业余的项目,也建议你使用代码管理工具,即使是一个人. 甚至你也可以将文档, 知识管理, 博客等也用代码管理工具版本化起来.
当然这里提到的几种代码管理工具都是有GUI版本的和命令行版本的, 个人还是极力推荐使用命令行, 为什么,可以参考这里 如何提高程序员的生产率.
后记
对了,差点忘了推荐几个常用的hosting服务, 常用的如下:
- google code (支持svn, hg)
- bitbucket (hg, 极为推荐, 免费提供1个private和任意多个public的代码库)
- github (git)
当然上述的都是免费的服务,建议大家尝试下.