分布式版本管理系统(Git)要比集中式版本管理系统(SVN/CVS)优秀很多么?如果是,在哪些方面?

lifesimple
  • 816

学习git的相关知识
看到下面描述git作为分布式版本管理系统相对于那些集中式版本管理系统(SVN)的优势
集中式版本控制系统

分布式版本控制系统

集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

上述摘自廖雪峰git学习教程

上面主要讲了两点优势,但并不是很理解和认同

  1. 集中式管理系统必须联网,局域网还好,要是网络差的情况提交个文件会很慢。SVN的话我离线先写然后等有网络了再获取和提交不也可以么,如果网络很差的话git提交文件到github上(或者其他平台)不也一样会很卡么

  2. 分布式版本控制安全性会高很多,集中式版本管理因为有中央服务器要是中央服务器挂了就不能获取代码工作了,但是git分布式系统就没有这个问题,因为每台机子都有完整的版本库。但是平常工作中用SVN,每天都会更新获取代码,感觉每个人的电脑上都有一份版本库,就算突然SVN服务器挂了,但是每个人机子上代码也并没有就丢掉啊?

自己工作中更多的还是用SVN
希望对版本管理工具理解较深的同学,这方面能给讲解下,帮助理解下。
不胜感激。

回复
阅读 4.3k
5 个回答
lifesimple
  • 816

自问自答
贴个stackoverflow上这个问答,首赞答案回答的相当棒,理解了很多。
Why is Git better than Subversion?

Git is not better than Subversion. But is also not worse. It's different
The key difference is that it is decentralized. Imagine you are a developer on the road, you develop on your laptop and you want to have source control so that you can go back 3 hours.
With Subversion, you have a Problem: The SVN Repository may be in a location you can't reach (in your company, and you don't have internet at the moment), you cannot commit. If you want to make a copy of your code, you have to literally copy/paste it.

With Git, you do not have this problem. Your local copy is a repository, and you can commit to it and get all benefits of source control. When you regain connectivity to the main repository, you can commit against it.

This looks good at first, but just keep in mind the added complexity to this approach.

Git seems to be the "new, shiny, cool" thing. It's by no means bad (there is a reason Linus wrote it for the Linux Kernel development after all), but I feel that many people jump on the "Distributed Source Control" train just because it's new and is written by Linus Torvalds, without actually knowing why/if it's better.
Subversion has Problems, but so does Git, Mercurial, CVS, TFS or whatever.

之前提问的理解,没有去考虑版本管理工具的核心用处,当然是管理版本。

  1. SVN离线或者不在局域网没连上SVN就不能提交代码,也就不能做版本管理,所以要是用SVN在这种情况下你并不能回到几个小时前的代码。但是git就没有这个问题,你可以在本地做代码提交,本地就相当于SVN的中央代码服务器,可以做版本回滚等。

  2. 还是版本管理的问题,分布式相比于集中式的安全,SVN崩了的话,虽然最新版本的代码还保存在每个人机子上,但是以前的版本就没有了啊,这个是版本管理工具的核心功能。但是如果用git,就算你的本机硬盘烧掉了,代码没了,但是其他人那还有完整的版本库,你可以git过来然后继续使用,很方便。

我觉得
Git is not better than Subversion. But is also not worse. It's different
这句话说得很赞,只是不同,都是工具,根据适用场景选择。SVN简单快速,很容易上手;Git需要一段学习成本,适合开源项目。

应该还是要看使用场景.
说什么svn一旦离线就用不了,我觉得这在一般的使用场景实在不应该算问题.
也是最近对版本控制有了新的看法.我们常说的版本控制,其实是干了两件事.版本控制+同步工作成果.
集中式的svn,把两件事一起干了.如果你要使用版本控制,就必须提交到服务器.在开发过程中,我们经常会出现,只是为了保存进度而进行的无意义commit.
分布式的git,两件事是分开的.当你进行commit操作的时候,只是把你的操作加入你本机的版本库.当你需要同步工作成果的时候,你在提交到远程服务器就好.

svn一直在用,但仅限commit和update.对分支的理解不知道对不对哈~
svn的branch和tag就是个目录.而如果你用过git的branch和tag,会觉得他们应该就是这样用呀~

推荐搜一下 "git工作流" 了解一下对分支的应用.

可以看看这篇文章
https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md

  1. Git 可以先提交一部分代码至本地代码库,这样就可以随时 roll back 至某个 commit. SVN 在没有提交之前想要 roll back 就只能靠肉眼了。

  2. 产品通常有一大堆 branch 维护,而每个开发者本机上通常都只有当前的 working branch。 如果 SVN server 挂了,会丢掉那些没有人正在用的 branch。如果刚好这个时候某个客户说,你三年前发布的某个版本有个致命的 bug。。我想没有多少人的电脑上会保存三年前的某个 branch 吧。。
    差点忘了,File history 之类的历史记录也可能丢失。

想想就觉得是个灾难。。

赶紧抛弃 SVN,投入 Git 的行列吧,嘿嘿。。

git 和 svn 各有所长,不能说直接摒弃 svn 可以参照微软 office团队想用 git 之后又选择使用 svn

宣传栏