水篇幅,不喜欢凑热闹的跳过
从代码丢失说起
作为一个辛勤的码农,代码就是一块块砖,一天天要垒高墙,那是还是个意气风发的炸毛小伙,快乐地码着代码。突然有一天,感觉代码不是很漂亮,所以删掉了文件,同时个人有强烈的洁癖,删文件一定要shift+del。所以,那一次真的很酸爽,把整个工程直接销毁,从此后悔了一辈子!
有了第一次的代码丢失的经历,让我得以思考,有什么办法能把祖传代码保存起来呢?
从现在说起
十几年过去了,我从炸毛小伙变成了油腻大叔,是个程序员都知道有种代码托管这个玩意。没听过SVN也听过Git,这都有啥好说的~
本来团队也是用着SVN好好的,突然有位同事站出来,我觉得Git好!顿时严肃的气氛笼罩整个会议室!但想想作为一个合格的项目经理,怎么可能去激发矛盾,所以安抚好同事,说下来咱们好好研究研究。
Git和SVN的区别
有人会说了,Git就是比SVN好,SVN一无是处。能理解程序员思维,但从项目管理或者公司管理的方面来看这个问题,Git和SVN只是一个版本管理的工具而已,只有合不合适,没有好坏之分。咱们就好好来说说他们之间的优缺点了。
架构方式
Git和SVN最显著的是架构方式的不同,SVN是集中式的管理,Git是分布式的。在组织结构上,Git要复杂于SVN。
上图是git的结构,服务端作为远程仓库,客户端都会有一个本地仓库,是远程仓库的一个拷贝。如果远程仓库不可用了,宕机或者网络不可达时候,client又可以作为服务端来提供临时的协作。由于有本地仓库,代码又可以提交到本地仓库,一些代码的修改可以立即提交,就能实现离线修改代码啦。
而SVN是简单的CS架构,所有的代码都必须提交到服务器,本地只有拉取的版本的代码。而且脱离服务器,那就只能自己玩玩了,提交、查日志什么操作都不行了。
拉取仓库
Git是要完整拉取仓库下来,包括所有历史的提交记录,而SVN只能拉取对应的版本代码。由于这个特性,如果在Git上提交大文件,然后再修改多几次,这就是让人头疼的事了。Git在处理大文件上性能下降很快,所以没事不要在Git上丢一堆大文件。相反的,在SVN提交大文件上性能要比Git好很多。
分支
SVN分支是作为存储库中的目录创建的,这种目录结构是SVN分支的核心痛点。当分支要合并时,如果你不是唯一合并变更的人,这意味着冲突、丢失的文件和混乱的更改困扰着你的分支。这导致了一个复杂的分支和合并模型,管理起来也很耗时。
Git分支只是对某个提交的引用,重量轻但功能强大。可以随时创建、删除和更改分支,而不会影响提交。比如你需要测试一个新特性或者你发现了一个bug,可以创建一个分支,进行修改,将提交推到中央仓库,然后删除这个分支。
使用方法
Git由于的设计理念,中间相比SVN有更多的概念,有复杂的指令支持。这样对比起来,SVN就变得简单了,不需要记忆太多的命令,而且SVN界面支持比较友好一点。
- Git命令:
add Add file contents to the index
am Apply a series of patches from a mailbox
archive Create an archive of files from a named tree
bisect Use binary search to find the commit that introduced a bug
branch List, create, or delete branches
bundle Move objects and refs by archive
checkout Switch branches or restore working tree files
cherry-pick Apply the changes introduced by some existing commits
citool Graphical alternative to git-commit
clean Remove untracked files from the working tree
clone Clone a repository into a new directory
...
还没完,后面还有一两百个命令,就不列举了~
- SVN命令:
add
auth
blame (praise, annotate, ann)
cat
changelist (cl)
checkout (co)
cleanup
commit (ci)
...
SVN命令比较简洁,只有二十多个
权限控制
Git只要是贡献者就有同样的权限;而SVN允许更灵活地控制权限,连一个文件都能设置不同权限,真正武装到牙齿。
总结
通过上面的对比,简单总结下优势,看东西要看优点,要有发现美的眼睛。
SVN优势
- 可以保存大文件而不丢失过多性能
- 使用简单,学习成本较低
- 权限控制更灵活,同时集中式管理更能控制权限
Git优势
- 优秀的分支管理
- 更活跃的社区和支持
- 更好地支持自动化和DevOps
后续
当初选择SVN是基于项目团队的能力和公司对代码的敏感度。目前团队成员不是很多,SVN还是够用的,后续可以慢慢切换Git来满足团队的发展,怎么说也在把CI/CD搭建起来了,需要更灵活和强大的代码管理。