一万小时 / 你使用源码管理工具吗?

远没到拼智商的时候

你使用源码管理工具吗?

2009-11-27 posted in [点滴技术] with tags: []

你使用源码管理工具吗?

本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛出处 ,并且 非商业 .

点击 订阅 来订阅本博客.(推荐使用 google reader, 如果你的浏览器不支持直接订阅,请直接在 google reader 中手动添加).

点击 下载pdf阅读 (如果浏览器不支持直接打开,请点击右键另存)

摘要

本文主要介绍使用源码管理工具的好处, 及其几种常见的源码管理工具的比较等.

引入

其实故事是这样的:

上周一个本科的同学来北京出差, 和朋友一起去吃饭, 总共是3个人, 外包公司工作快3年的朋友(简称为A), 北邮研二的研究生朋友(简称为B), 和我. 一个偶然我们提到了技术,提到了源码管理工具, svncvshggit 等. 友A有一定的了解, 说他们使用sourcesafe来进行代码管理, 言语中透露出对源码管理工具的不熟悉. 友B竟然没有听过!我一边感慨 国内教育,一边也语重心长地向他极力推荐了源码管理工具.

最近老在想, 为什么北邮的同学计算机专业硕士居然没听说过代码管理工具?作为程序员又有多少没听过没用过呢?

于是有了写这样一篇代码管理工具介绍的文章.

什么是源码管理工具

你用过CVS, SVN吗?你知道分布式的源码管理工具吗?

这里我也就不引用别的定义, 我只想说说我对源码管理工具的认识.

简单地说, 源码管理工具是一种 记录代码更改历史, 可以无限回溯, 用于代码管理,多个程序员开发协作的工具.

常见的功能有:

  1. 更新到任意一个版本(不用担心代码的修改错误,和丢失等)
  2. 日志记录(说明修改目的)
  3. 分支,标签(用于协作开发, 和便于阶段性产品发布)
  4. 合并,比较(用于多人,多分支之间的代码合并,比对等)

为什么要使用源码管理工具

你可能会想, 需求出来了, 老大把我要做的功能告诉我,我去写代码就行,完事了,我再打包发给他 让他加入到整个代码中,然后测试.有问题再反馈回来,我再修改,再打包.这样不是也挺好吗?

当然我要说,这样当然是可以的,但是如果你们要修改同一个文件怎么办?你们还得事先商量确定 某个时间某个人不能修改等等. 或者新建不同的名字的文件,最后由一个人来合并.

如果你的团队不是3,5个人,而是30,50人呢?你这样的沟通和重复性工作的成本会有多高?

于是聪明的程序员便有了版本控制的设想, 继而有了源码管理工具的不断推陈出新.

如果你稍微开发过一个正式的项目,想必你对 cvssvnhggit 这些也一定 有所耳闻.

下面就简单根据我个人的一些项目经验来介绍下2类的源码管理工具.

源码管理工具介绍

简单地可以将源码管理工具分为两类: svn 这样的集中式的,和 hg 这样的分布式的.

因为我个人对 svn 和 hg 比较熟悉,所以下面就以这二种具体的工具为代表来说明二者的优劣.

第一次接触源码管理工具就是 svn, 想着那时对于什么 增量修改历史记录 等概念不清楚时, 也曾在写了2小时的代码后,提交svn时失误而导致文件被删除的悲惨历史. 惨痛的教训让我开始了系统地 学习svn的过程, 一天后,我明白了它的原理, 这时会很晰明确地知道每个命令的结果, 也会很清楚地知道 自己怎样做才是最合适的.

简单总结一些best practice:

  1. Check in early, Check in often(这个是很重要的,尤其是多个开发的团队,这样可以大大减少冲突的可能)
  2. 发现冲突第一时间解决(不能将冲突留给你的同事,发现了第一时间解决, 如果需要要向冲突的相关同事沟通交流)
  3. 只提交需要提交的文件(一些临时文件不要提交,不能污染整个代码库)
  4. 熟悉常用的命令,如add/rm/up/ci/co/stat/merge/diff等

大致一个月后,我逐渐明白一个源码管理工具对于一个项目的意义和作用. 自此后, 我去公司实习我会第一时间询问 他们是否使用源码管理工具,使用哪种工具. 而对于自己的一些业余项目,我也通常是使用 google code 来管理起来, 甚至当前的这些博客的源码(不过最近已经迁移到了hg的一个hosting service下,原因请参考下文).

到了去年的晚些时候, 开始知道了分布式源码管理工具, 了解了它与集中式工具的区别和优势. 也听到了一个小故事,

说是Linux的作者Linus大牛不满svn, 于是自己花了一周(?抱歉具体时间记不得了)写了个分布式的代码管理工具,
于是就有了大名鼎鼎的git.

我们不去羡慕Linus大牛的英明神武(啊,真是牛啊!), 我们来关心他的作品 分布式代码管理工具. 它与集中式的 究竟有什么区别呢?

我以 hg 为例来说明与 svn 的不同:

  1. 每个work copy(也就你自己检出的代码)都具有完整的代码库信息, 这也就是说:

    • 对于检出的代码,我们无论是查看log, 提交代码, 或者删除等都是本地的操作,而无需与服务器打交道
    • 只有push/pull两个操作(其它的初始化等操作不计入内)与服务器打交道,其它的日常操作都是本地
  2. 集中式的版本文件信息(所有的版本文件信息都位于项目根目录下的.hg目录下,而不像svn每个目录下都有一个.svn目录)

  3. 简单的忽略文件设置:.ignore文件中可以简单地设置你不希望提交到版本库的文件(支持通配符)

简单地说,我更喜欢hg的原因是,我无需再为了查看log而等半天(与服务器通信), 这样大大地方便了网络不好, 分布式的开发环境.

一些建议

我不说使用了代码管理工具的公司就是好公司,但是我肯定没有使用代码管理工具的公司肯定不是好公司.

同样, 使用了代码管理工具的程序员不一定就是好程序员,但是没有使用代码管理工具的程序员肯定不是好程序员(至少 没有经历过一个真正的多人协作的项目).

以我个人的项目经历,我极力向我的读者建议:

如果你没有使用过代码管理工具,请赶紧去学习一种(个人推荐 hg).

如果你还使用的是 svn, 推荐你去尝试下 hg.

如果你在做一些业余的项目,也建议你使用代码管理工具,即使是一个人. 甚至你也可以将文档, 知识管理, 博客等也用代码管理工具版本化起来.

当然这里提到的几种代码管理工具都是有GUI版本的和命令行版本的, 个人还是极力推荐使用命令行, 为什么,可以参考这里 如何提高程序员的生产率.

结论

代码管理工具对程序员而讲是必不可少的开发工具, 选择一个合适的工具并且熟知它的常用命令,会让你的 开发(你的团队的开发)变得事半功倍.

你在使用什么代码管理工具呢? 欢迎留言说明.

后记

对了,差点忘了推荐几个常用的hosting服务, 常用的如下:

  1. google code (支持svn, hg)
  2. bitbucket (hg, 极为推荐, 免费提供1个private和任意多个public的代码库)
  3. github (git)

当然上述的都是免费的服务,建议大家尝试下.

本文的源码

本文的rst源码链接在 这里 .

点击 下载pdf阅读 (如果浏览器不支持直接打开,请点击右键另存)

comments powered by Disqus
Top

Press q to hide the help

Key Action Key Action
Small Scroll j Scroll Down k Scroll Up
Big Scroll b Scroll to Bottom t Scroll to Top
Post Navigation n Next Post(if exists) p Previous Post(if exists)
Page Navigation h Go to Blog's Home Page a Go to Blog's Archive Page
Page Navigation c Go to Blog's Category Page ? Show this help
Misc s Go to Search Box q hide the help