毕业搬砖快一年半了,
有加班,但惭愧的是,没有获取别人三年的工作经验。
使用过Git和SVN。
从使用者角度,来评价一下这两个版本控制系统。
SVN特点
- SVN是集中式控制系统。需要一个中央服务器
- SVN功能简单,指令简单,入门容易
Git特点
- Git是一个分布式系统。但,通常会约定一个主机作为中央服务
- Git功能完善,指令复杂,入门简单掌握难
- 重中之重:Killing feature — 分支功能
两者的比较
分布式vs集中式
使用版本控制的目的之一,就是为了协同开发,需要将本地的修改通知给协同开发的用户。从稳定可靠的角度来看,分布式肯定是更好的选择。
但Git的分布式,我觉得需要换一种理解。
- 如果是集中式,只需将修改提交到中央服务器就行。提交一次即可。
- 如果是完全的分布式,每个用户都是相对独立的,那修改内容需要如何通知协同开发的诸君呢?(分别通知合作的所有人?)
介于分布式的通知问题,通常来说,Git会固定一个源作为中央服务器。
分布式的核心,不在于如何去通知他人修改更新的内容,不在于是否是有一个中央服务器,在于本地的数据内容
SVN可以只checkout项目的某个子文件夹(甚至可以只检出单个文件)这时候在本地的项目就不是完整的。
Git在clone的时候,会在本地有完整的项目内容。所以当主机硬盘坏了,还有分散在各地的备胎。(百度后得知,Git也能通过奇淫巧技只检出指定的内容,但是本地的Git数据库是完整的)(PS:可能这就是所谓的好的设计总是相似的)
难度
- SVN
- SVN只要知道 svn co, svn up, svn ci, svn revert, svn merge, svn resolve, svn cp, svn log这几个常用指令,就能很好的生存。
- 这些指令都是缩略后的短指令。其中svn co == svn checkout。SVN中默认就有短指令。
- SVN功能相对简单清晰。打tag就是copy操作,拉分支也是copy操作,但是copy指令费时间。对于同一个行为,大部分情况下只有一种操作,即指令和行为能一对一
- Git
- Git入门也只需要git branch, git checkout, git pull, git push, git commit, git add这几个指令就科可以。但是要掌握Git,那就需要更多时间,更多指令。
- Git的短指令需要修改配置文件,能够兼顾用户的喜好,但是费事。
- Git的指令通常带有复杂的参数,一个行为对应多个指令。深入使用之后,会让使用者十分困惑。分支是Git的killing feature,不如说是killing and confusing feature。git checkout检出指令可以新建分支,git branch也能新建分支;由于是分布式,如果需要确定追踪(track)远程分支,还需要加入额外的参数(当然这一步也可以延迟到更新或者提交的时候操作)。
- Git指令繁多。其中rebase指令可能会带来潜在的同步问题,所以还有使用潜规则:只在本地rebase,不要将服务器上已有的分支做rebase操作。
- Git数据更新行为模糊。在Git上如果服务器删除了一个分支,本地没有删除。这个时候可以将本地的分支push到服务器上。即使本地也删除分支之后,git数据库中的信息也要更新,还需要用到git remote prune branch_name这样的指令。不然使用git branch -r 指令列出远程分支,被删除的分支依旧存在。
- etc
总结
看到这里,诸君看到我列出Git的这么多缺点,心理应该有谱了吧。
没错,想要复杂的功能,就要承受学习的代价。
Git因为其定位分布式,会引申出许多数据同步的问题,所以引入了许多和SVN不同的指令;又因为分支的实现并不是无脑的文件复制,所以分支指令有很多花样的玩法,值得尝试,也需要谨慎使用。
Git的分支操作, 从本质上说只是新建一个文件夹,记录一些文件指针,所以速度非常快。而且有个重新应用提交的cherry-pick的指令,万一在错误的分支上开发,可以重新应用提交到正确的分支上,回滚后将正常的提交再次应用。
这两个版本控制一直持续到现在,两者都有其优点和缺点。
个人认为两者没有绝对的优势,能够取代另一方。
但是从功能上来讲,Git拥有SVN大致所有的功能。
还拥有更多可靠,便捷,个性化的指令方便操作。不过就是需要比SVN多得多的时间来学习。