题注:
在 eggjs 团队的日常协作中,深度依赖于「基于 GitLab 的一站式硬盘式异步协作模式」。
本文作为相关介绍文章第一篇引子,转自阿里内部,已获作者 @晚学 授权。原文标题:「我是这样开始用 Git 的」
前言
如果这篇文章以 「Git 好用到没朋友,甩 svn 十条长安街」的基调开始,中间插上一大段从网上抄来的、已经被转载得满地球都是的、看着特有道理但自己看完却完全没感觉的文字,末了结尾处高喊 Git 我爱你并且自作多情的留下 6 个亢奋的感叹号的话(吁……先喘口气),那么,这篇文章肯定收了钱了。
我们以码字为生的文字工作者最重要的精神就是:冷静并客观。
所以今天,我们就冷静并客观的来看看 svn 和 Git,看 Git 是不是后生可畏,看 svn 是不是老当益壮。
入门总是伴随着惨不忍睹可能大部分人跟我的经历是一样的,最先接触到的 VCS(version control system)是 svn ,然后为了不被人家说土,开始尝试认识 Git。
如果把 svn 和 Git 比作朋友的话,他俩可谓性格都非常分明,svn 是个直肠子,简单直接,从不绕弯弯,svn 命令语义非常清楚,如果你不是高级 SCM ,你只要学会:
svn checkout svn update svn commit svn revert
大概你就能够和别人进行协作开发了,你看,多简单。
但 Git 不一样,他可不是个随和的朋友,他比 svn 有个性太多了,相信大部分开始学习 Git 的人都曾经被这句话搞到怀疑自己的智商以至放弃 Git -- Git 是一个分布式的版本管理系统。
一开始你感觉是这样的:我勒个去,分布式,很高端啊,哥得看看。
看了半天,你心里打鼓了:矮油我去,看了半天命令有点蒙圈,不过还是能够清醒的认识到自己完全没理解 「分布式」这三个字用在 Git 里面是个什么意思的。
再回过头去看看 Git 命令,你会坚定的认为代码的归宿就应该是 svn,Git 搞那么复杂是在秀智商么?滚蛋,一边玩去。
但是当你听到外面有人不断的说:“Git 太特么好用了,简直神器” 之类话,你又开始怀疑自己:是我太笨还是这个世界太荒唐?
我就是这么一路走过来的。
实际上...实际上,svn 和 Git 只是两个不同的东西而已,Git 没有比 svn 好到天翻地覆,svn 也没有人们嘴里说的那么不堪。
作为工具来讲他俩都专注的做一件事情:版本控制。最大的差别就是这个所谓的 「分布式」,那么这个分布式到底是个什么鬼?
svn 的架构我们都很熟悉了,经典 CS 架构:某个地方 run 着一个 svn server,上面存放着很多代码仓库,所有人通过 svn client 和 svn server 进行交互:拉取代码、提交代码、更新代码。一切都是那么的自然。
Git 号称分布式的意思是说 “在某个地方 run 着很多 git server ” 么?如果是这样的,好像也没什么稀奇的呀,相信 svn 也能做到。
实际上……所谓 Git 分布式版本控制和 svn 传统版本控制的区别是这样的:
svn 模式:本地文件 → svn 远程版本控制服务器
Git 模式:本地文件 → 本地版本控制“服务器” → Git 远程版本控制服务器
差别就是 Git 在你本地多做了一次版本控制,相当于在你本地有一个 svn 服务器,远端还有一个 svn 服务器,那么为什么要这么做呢?原来 svn 那种直观的模式不是挺好的么?
实际上……原因很简单,我们来看一个故事,这样的场景每天都在上演:
有一个项目,需要 10 个人一起协作完成。
v0.0.1 的时候:大家用 svn ,新建了一个叫 XX-v-0.0.1 的仓库,所有人都往这个代码仓库里面提交代码,久而久之大家发现,别人提交的老是会影响到自己(就是冲突啦),自己提交的也会影响到别人,人数越多这个影响就会被放的越大,甚至有时候由于一个人的失误提交导致大家都没法工作了,如果这种“失误”每天多发生几次,基本上就没什么心情写代码了。