svn和git都用过,但都是浅尝辄止,只知道提交和更新,顶多再解决下冲突,看看log,其他就不知道了。或者说非常模糊,真要去用,捣鼓一会也没问题。基本功能能解决大部分问题,就不想投入更多精力在上面了。对于很多工具我都采取的是这种态度,够用之后就不去深究。或者我深究过,但之后没机会用,因而体验不深或者根本就忘了,认识也就一直很肤浅,这让我心慌。
大部分人都认为git优于svn,理由却又说不上来。git现今基本已经一统江湖了,svn属于被淘汰的上一代产品。很明显必然有更大的优势。
- git各人都有一份完整的拷贝,本地就能进行版本管理。svn需要联网,集中管理,所有代码维护在中心。去中心化使得更大的团队的维护变得容易。
- GIT牛掰的地方在于对分支管理,子项目依赖,代码冲突管理上比SVN高出不止一个数量级。
举个例子:用一个开源的库,我们需要对开源的库某些部分进行修改,但是又想保证该库紧跟官方发布不过时。用SVN的话,要不一切手动,要不你就把你的修改提交到官方源去(基本上是不可能的)。用GIT,我可以克隆一个repository,新建一条branch保持私有修改,官方库有更新随时pull --rebase。 - GIT的commit还可以乱序修改。比如说队里的熊孩子搞砸了,一连几个commit都不能编译。太简单了:用git rebase -i可以把一条branch上的坏commit一个一个剔掉。换了SVN,提交了坏代码的话,天皇老子都没法改。
- 分支合并的方便和速度提升。基于revision的版本控制有一个弱点,就是在和合并时要将直至公共祖先前的所有revisions用复杂的算法重演才能完成合并的过程。而基于状态的git在合并时,只需要在公共祖先,两个分支的最新commit间发起一个3-way merge就可以了。因此git的合并速度出奇的快。也因为如此分支创建无以伦比的简单。(svn保存差异文件,git保存文件差异)
- 微commit和微branch。git可以任意的commit和branch使得VCS对代码的控制可以达到非常细的粒度。每一个小的修改都可以立即commit,每一个小功能/fix都可以branch。这使得测试一个小修改该和drop一个小功能都非常的容易。甚至你可以随便将另外一个分支的某个commit直接打过来用在当前分支上(cherry-pick)。使得用户面临频繁的需求变动也可以轻松的管理代码。
注:大量引用网友观点。