git是svn的替代品?
我刚接触git的时候,我的第一反应就是:git是svn的升级版,就好像当年svn替代了cvs一样。直到自己用了之后,才知道git这东西和svn一点儿也不一样。
凭着自己对svn的经验,我没有看使用手册和相关教程,直接开用。很快,我发现这东西和想象的很不一样!搞不清一会儿要commit,一会儿要push,都是些什么概念。碰了壁,然后开始学习git。所以,git这东西反直觉,需要专门学习。当初,从cvs转到svn的时候几乎没有学习成本。
问了周围用git的人,大多认为它学习成本很高。肯定是这样,尤其对没有使用过分布式版本控制系统(distributed version control system)的人来说。因为它的概念和传统的svn这样集中管理的系统不一样。概念不一样的话,学习就需要从头学,难以复用svn的使用经验。听说,有些公司内部推git,用了一阵之后,又转回svn了。
有些公司内部在推git的时候,往往会推一些实用的best practice。我想说的是,不能把best practice当操作手册来用,一定要搞懂它背后的理念。否则,best practice根本不能practice。我看到best practice基本都很难推行,因为工作中会遇到各种各样best practice不能涵盖的场景。由于git的状态比较多(光本地机器上就有working area, index和commit库),所以实践中可能会遇到各种不同的组合。如果,自己再建立些branch。。。够你喝一壶的。 所以,一定要搞懂它背后的理念,才玩得转。
我自己用IntelliJ做开发,所以直接用IntelliJ集成git的插件。使用感觉还不错,图形界面比命令行友好很多啊。不过,由于git的功能复杂,git的插件只能涵盖一部分日常的操作。因此,我的工作模式是“混合模式” : 命令行 + IntelliJ集成git的插件。光靠git的插件可能有些操作不太准确,因为IntelliJ也是调了git的命令行,里面加了一些参数。总体来说,我个人还是比较喜欢用IntelliJ集成插件。譬如说,冲突文件的合并。尤其是rebase操作,这个交互式操作用IDE来做很合理,过程像wizard。
企业里面都是商用代码,一般都倾向于集中式管理。所以,我认为git在企业里的作用远没有开源社区来的有意义。git的理念是“人人平等”,人人都有代码库和代码历史。随时可以拉出一个branch就可以开搞自己的代码。svn里面把代码迁出来叫checkout,在git里面叫clone,体会一下两个单词不同之处:)
关于branch,git鼓励拉branch。正规一点的开发团队都会用持续集成,一般都会盯着一个branch做集成。开发人员就算拉再多branch最后还要合并。而且要及时合并。你一个月没合并的代码做合并的时候,会搞死人的。
那么多开源项目都迁移到github上面来了,连google-code都撤了,你能不用吗?听说github都已经成了“世界上最大的同性交友网站”了。而且,又有一批牛人都纷纷站出来赞美git,痛斥svn苦大仇深的经历。(我看之前好像也没人站出来喷svn啊,虽然之前也有mercury这样的分布式工具)。
大家都买Linus的帐。他写出来的东西,你敢说不好用么。