这是一个坑,我自己挖的坑。当初IBM的面试时候我在简历上写了用过SVN和GIT(确实用过),单纯会用,但是没有深入研究过,然后问到了SVN和GIT的区别是什么,我又没有答出来。啊啊啊!!!很可惜的一道题,其实并不难,就是我不会讲,当初也没有考虑过。现在找了点资料,整理下吧。
一提到GIT和SVN,最大的不同就是Git是分布式的,而SVN不是分布的。GIT跟SVN一样有自己的集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。所以即使没有网络也一样可以Commit,查看历史版本记录,创建项 目分支等操作,等网络再次连接上Push到Server端。而SVN就做不到这一点,必须保证有网。
除此之外,GIT是把内容按元数据方式存储,而SVN是按文件的。所以你会发现,.git目录的体积大小跟.svn比较,它们差距很大。因为git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
Git没有一个全局版本号,而SVN有:目前为止这是跟SVN相比Git缺少的最大的一个特征
Git的内容的完整性要优于SVN: GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏
提交(Commit)上的不同:在SVN,当你提交你的完成品时,它将直接记录到中央版本库。当你发现你的完成品存在严重问题时,你已经无法阻止事情的发生了。如果网路中断,你根本没办法提交!而Git的提交完全属於本地版本库的活动。而你只需“推”(git push)到主要版本库即可。Git的“推”其实是在执行“同步”(Sync)。
Git check out后,在OffLine状态下可以看到所有的Log,SVN不可以。
分支(Brach)不同。
分支在SVN中一点不特别,分支在SVN就是版本库中的另外一个完整目录,且这个目录拥有完整的实际文件。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。所以,经常会发生有些分支被遗漏的情况。如果工作成员想要开啟新的分支,那将会影响“全世界”!每个人都会拥有和你一样的分支。如果你的分支是用来进行破坏工作(安检测试),那将会像传染病一样,你改一个分支,还得让其他人重新切分支重新下载,十分狗血。而 Git,每个工作成员可以任意在自己的本地版本库开啟无限个分支。