什么是 Git?
Git 是目前世界上最流行最好用的分布式版本控制系统 。这里面有两个重要的概念,分布式和版本控制。
什么是版本控制?
大二了,老师在数据结构预算法课上讲自己接了一个项目,想接触下真实项目提前练练手的同学可以课下联系我,有报酬。一听说有报酬,各个都踊跃报名,最后老师选了六个实力还不错的同学加入了自己的团队。
由于王大仙技术能力比较出众,所以被选为组长一职。分析需求,画 ER 图,定数据库表,确定项目结构。前前后后忙活了两个星期,终于可以动手写代码了。王大仙很兴奋,终于可以施展下自己的技术能力了。
第一天,王大仙先在自己电脑创建了一个 maven project,把包创建好,配置文件写好,确定可以跑起来之后就把空的 project 发给了其余五个人。并叮嘱他们各司其职,弄好自己负责的模块。
三天后,王大仙想了解了下组员们的开发进度,感觉是时候做一个小的测试了。问题是怎么把他们的代码集成到自己项目这里呢。看了一下,才十五个类,于是王大仙就一个一个的把它们从组员的项目拷贝到自己的项目这里。一运行,发现缺少 jar 包。看日志是王二小做的权限模块依赖的 shiro 包没有导入。于是乎把 shiro 的依赖加入自己的 pom 文件。终于跑起来了,大家都松了一口气。嗯嗯,效果还不错,组长面带微笑的说到。交代了一下接下来四天的任务,大家去大排档撸串去了。
四天后,又到了合并代码的时候了。大仙一看傻眼了,足足差不多有接近一百个类,而且还分布在不同的包结构中,难道还要一个一个复制吗。可是也没有其他办法呀。哎,那就来吧。本着我不下地狱谁下地狱的态度组长开启了漫漫复制路。可谁知,那里只是简单的复制粘贴呀,张大帅和江小白俩人负责的用户管理模块里面有很多同名的文件,怎么把两个人的代码弄到一个文件里呢?又是一段漫漫复制路啊。王大仙小心翼翼的把江小白的代码复制到张大帅的文件里,生怕复制错位置,所以每次复制粘贴时都要两边看看文件名是否一致,看看是否重复复制。三个小时过去了,终于把所有的代码都集成到自己项目里面了。运气还不错,项目居然没有报错,跑起来了,一看效果,大仙很满意。于是乎,交代了下一周的任务之后他们又去撸串了。
一周后,看到组员那里密密麻麻的类文件,大仙感觉生不如死。足足有八百多个类文件。而且有很多个文件不仅有一个人在做修改。任凭大仙技术能力再强,在这里也无计可施啊。只能乖乖的一个一个小心翼翼的去复制粘贴。大仙加班加点熬了两个通宵终于把全部文件都搞完了,已经过去两天了。大仙感觉比写代码还累。
终于把组员的代码都集成到自己项目里了,跑一下试试吧。还行,没啥重大 bug,已经连续通宵两个晚上的大仙终于可以回家好好休息了。
休息了一宿,大仙感觉精力充沛,不亏是年轻人,恢复的就是快。准备去实验室大干一场。天不如人愿,来到实验室打开电脑之后发现昨晚好好地工程今天打不开了 ,不知道啥原因就连磁盘里面的工程总目录文件夹都打不开了。那可是我们忙活了半个月的成果啊。怎么说打不开就打不开了呢?大仙深深的感觉到了绝望。
其他人的代码还好,自己电脑里面有存档,可是自己这一个星期写的代码全部都打不开,也就是说要把上周自己写的代码再重新写多一遍。大仙哭晕.jpg。
在大仙补代码的这两天,也没让组员闲着,让他们先两两合并。合并完之后再两两合并,黄天不负有心人,终于在大仙把代码补完的同时组员也把代码合并完了,就差把自己的代码合并进去就好了。
有了上一次的经验,这次大仙学聪明了,先把自己的代码复制了一份,取名 myCode.zip。然后每合并一些代码都会备份一个新的文件。一天后,大仙电脑硬盘 code 文件夹里面有如下文件:足足有二十个之多。
myCode.zip
allCode_20180320初稿.zip
allCode_20180320初稿2.zip
...
allCode_20180320定稿.zip
allCode_20180320定稿2版.zip
allCode_20180320定稿终版.zip
allCode_20180320定稿终极版.zip
终于,万事具备,可以重新测试了。我曹,大仙不尽发出惊人般的吼叫,发现一个新加的功能有严重的 bug。需要用回旧的功能。也就是要把大仙辛辛苦苦加进来的功能有 bug 的代码恢复到之前没有 bug 的版本。更可恶的是这个 bug 组员都不承认是自己写的。因为产生 bug 的部分代码没有一个人承认是自己写的。想想自己合并代码漫漫长路,大仙哭晕再厕所.gif.
大仙不想在自己折腾了,去向老师求救。老师听了大仙的苦恼之后,甚为惊讶。说到:“你们咋没用版本控制系统呢?”。版本控制?这是啥东西?都没听过呀。于是老师耐心的讲解到,首先我先帮你梳理下你遇到的问题哈。
- 备份文件,防止文件丢失。
- 文件合并,你需要把其他组员的代码文件复制到自己项目里面吧
- 代码合并,如果有一个以上的人操作同一个文件,要把他们各自的代码都保留下来。
- 代码追踪。就是要查到这行代码是哪一个组员写的。
- 代码还原。当发布新代码之后如果有 bug,就回退到上一个版本。
以上这些就是版本控制要解决的问题。所以说,版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统,对于软件开发领域来说版本控制是最重要的一环。
分布式如何理解
这个分布式要和集中式放在一起理解。
首先先要明白版本库的概念,你想啊,版本控制系统是如何知道它要控制哪些文件的版本,如何知道谁何时修改了哪一个文件哪一个位置呢?是不是需要把这些信息记录起来呀。所以需要一个初始化的操作来告诉它,我要把这个文件夹作为版本库,你要负责记录版本变化信息。Git 的语法是这样子的 git init
。当你执行完这条命令之后会在当前目录多一个 .git
的目录。这个目录里面就记录了当前文件夹里面的所有文件的改动轨迹。如果把 .git
删除掉了,那当前文件夹就不再是版本库了。之前的版本信息也会丢失。
你可以把版本库理解为仓库,版本控制系统理解为仓库管理员。仓库管理员肯定知道自己仓库里面有什么物料吧,知道谁在什么时候放了什么东西进来,同样也知道谁在什么时候拿了什么物料出去。有一天仓库管理员没有做任何交接的情况下突然离奇失踪。那么没有一个人知道这个仓库之前谁在什么时候加了啥东西过来,又是谁在啥时候拿了什么东西出去。
集中式的意思就是版本库是放在中央服务器的,我们工作的时候就从中央服务器拉取文件到自己电脑,等修改完毕之后在推送到中央服务器。
分布式的意思就是,每个人的电脑都是一个版本库,这样子,你工作的时候是不需要联网的,可以随时的向版本库中添加文件,也可以将修改推送至版本库。那如何把合作呢,比如两个人同时修改了文件 A,只需要把各自修改的内容推送给对方就可以了「这里需要把对方的仓库添加为自己的远程仓库」。
但是在实际使用时,很少在两人之间的电脑上推送版本库的修改,因为项目组可能有很多人,不可能我改动一下就把修改信息推送给其他所有人吧。所以分布式版本控制系统也会有一个中央仓库,通常叫做「远程仓库」。这样子,当你在本地修改完毕之后先提交到自己本地版本库,然后推送至远程仓库。同事从远程仓库拉取代码到自己版本库,就看到你的修改内容了。
集中式需要联网,而且如果中央服务器宕机的话真个版本控制信息会全部丢失。
分布式是不需要联网的,不怕远程仓库的服务器宕机。因为每个人的电脑都是一个完整的版本库。当然优点不止这一点,还有强大的分支管理。
网友评论