先说我自己的糗事。2018年我在一家做母婴电商的小公司,后端一共5个人,用SVN管理代码。每次发版前一周,我们就要“锁库”,谁都不能提交新代码,只能改bug。有一次我合并一个功能分支到主干,手动解决冲突,结果不小心把同事刚写的优惠券逻辑覆盖了,线上跑了三天才发现,损失了大概2万块钱。老板没让我赔,但那个月绩效扣了30%。后来我们换成了Git,我以为终于解放了,结果仓库越来越大,从200MB涨到2.3GB,git clone要等8分钟。用git count-objects -vH一查,发现是设计部把PSD源文件直接提交进来了,一个文件就400MB。这就是不懂版本控制边界的代价。
后来我花了3年时间,把Git、SVN、Mercurial都用在真实项目里折腾了一遍。今天不吹不黑,给你几个硬核对比。先看分支操作:Git创建一个新分支,实测在Linux内核这种规模下,耗时0.02秒,因为它只是创建一个指针;SVN创建分支,要复制整个目录树,同样的项目要5-30秒,取决于文件数量。再看离线工作:Git可以本地提交、查看历史、切换分支,完全不需要网络;SVN必须连服务器,你在地铁上改代码,只能干瞪眼。合并冲突方面,Git用的是三方合并,能自动处理大部分情况;SVN是双向合并,冲突率明显更高。权限控制:SVN可以精确到目录级,比如只让张三访问/trunk/backend;Git原生没有这个功能,得靠GitLab或GitHub的protected branch。大文件支持:SVN原生支持,但速度慢;Git需要LFS(Large File Storage),配置命令是git lfs track "*.psd",然后git add .gitattributes。Mercurial呢?它介于两者之间,命令行更友好,但生态和托管平台远不如Git,现在用的人越来越少。
这里我要抛一个全新观点:版本控制工具的选择,本质上不是技术优劣问题,而是团队“协作熵值”问题。我发明了一个粗糙的公式:协作熵值 = 团队人数 × 地理分散度 × 代码耦合度。地理分散度:同城=1,跨时区=3,跨大洲=5。代码耦合度:低=1,中=2,高=3。举个例子:5个人同城,代码耦合度中等,熵值=5×1×2=10,这时候SVN的锁机制反而能避免冲突,够用。如果是20个人跨3个时区,代码耦合度高,熵值=20×3×3=180,这时候必须用分布式Git,因为每个人都能在本地独立工作,最后再合并。所以别盲目跟风,先算算你的熵值。
如果你现在正从SVN往Git迁移,我踩过的坑可以帮你省时间。第一步,安装git-svn,然后准备一个作者映射文件authors.txt,格式是svn用户名 = Git用户名 <邮箱>。第二步,执行git svn clone --stdlayout --authors-file=authors.txt svn://你的仓库地址 myrepo。如果仓库很大,加--revision 1000:HEAD从第1000个版本开始克隆。第三步,清理大文件:git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.psd' --prune-empty --tag-name-filter cat -- --all。第四步,添加远程仓库:git remote add origin git@github.com:你的用户名/repo.git。第五步,推送:git push -u origin master。注意,如果大文件还要保留,用git lfs migrate import --include="*.psd" --everything迁移到LFS。整个过程我花了6个小时,中途因为作者文件格式错误重来了两次。
再回答几个常见问题。问:Git克隆太慢怎么办?答:用浅克隆git clone --depth=1 https://...,只下载最新一次提交,速度能快10倍。但浅克隆不能直接推送到新仓库,需要git fetch --unshallow先补全历史。问:分支太多怎么管理?答:定期删除已合并分支,命令是git branch --merged | grep -v '*' | xargs -n 1 git branch -d。也可以用git remote prune origin清理远程已删除分支。问:小团队该用Git Flow吗?我的建议是别用,太复杂,develop、release、hotfix一堆分支,最后自己都记不住。小团队用Trunk-Based Development,每天合并到主干,配合短生命周期的功能分支,简单有效。问:二进制文件冲突怎么办?游戏公司美术资源多,可以用SVN的锁定功能,或者Git LFS配合git lfs lock。
最后说点个人感受。版本控制工具就像鞋子,合脚最重要。我曾经迷信Git,觉得SVN是上古遗物,后来在游戏公司看到美术用SVN锁定PSD文件,避免冲突,效率反而比Git LFS高。Git LFS虽然好,但存储要钱,GitHub免费只有1GB,超了要买流量。所以别听网上那些“Git天下第一”的言论,先看看你的团队怎么协作。我现在的公司用Git,但规定所有超过50MB的文件必须走LFS,仓库控制在500MB以内,克隆时间稳定在30秒。这就是平衡。