Git大法好——1.Git的引入以及概念解析
标签:Git
引言
在前面学习安卓基础入门的时候,简单的讲解了一下Git的简单使用,几个基本的命令这样,
让读者对Git有了初步的认识,而现在越来越多的开发团队采用Git作为版本控制工具,当然
还有一些公司依旧用着SVN或者其他的版本控制工具,不过也会相信慢慢过渡,比如开发Android
的两款主流IDE:Eclipse正在慢慢地被Android Studio替代!写Git系列的教程,初衷是想
帮助一些刚接触版本控制,或者想从SVN转到Git上的朋友,能够快速,系统的掌握Git的使用!
而本节要讲解的内容Git的一些概念性的东西!内容如下:
- 1.Git的引入(团队协作中版本管理的一点点改进)
- 2.Git的四个组成部分(工作区,暂存区,本地仓库,远程仓库)
- 3.Git中文件的几个状态
- 4.Git的下载安装
以上就是本节要讲解的内容概要!下面我们来对一点点的学习Git吧!
1.Git的引入
不知道你有没有和别人一起开发过同一个项目,没有也关系,我们举个例子来体验版本控制的变化:
假如开发团队有小猪,B神,基神三个Android开发人员,而我们现在需要一起协作完成一个XX的APP,
简单的分工后,我负责A模块,B神负责B模块,基神负责C模块,分工完后,我们要面对的问题就是
我们如何一起开发这个项目?我们通过一个个方案暴露的问题,一步步引入Git~
方案1:我先做完A模块,然后B神再在A模块的基础上来做B模块,最后再由基神完成C模块。
这样是可以,但假如这样做的话,效率会很低,很多时间都花在等待上,开发周期也会非常的长,
而且和一个人完成整个项目没什么区别,而这种也是大学做小组形式的课程设计的一种合作形式。
方案2:并行的开发,就是自己写自己的,等三个人都完成后,再进行整合。
同样也是可以的,但是等到最后再整合,这个整合的人是谁好?相信此时的代码量会非常的庞大,
记得小猪以前有一个XX门诊管理系统的小组课程设计,项目很小,逻辑也很简单,然而整合却花了
大概一周的时间,然后还各种莫名其妙的Bug(最后不了了之)...同样这也是大学小组课程设计的
另一种合作形式。我们需要想办法减少代码的合并难度,比如每天合并一次大家编写的代码,这样
做还有另一个好处就是可以清楚的知道每一个人的当天的工作进度,于是乎我们衍生出方案3。
方案3(SVN):将工程代码托管到某个服务器上,每天开始工作时,先把服务器的代码同步
到本地,然后再进行开发,然后工作结束后,把代码提交到服务器,此时可能需要解决冲突
(服务器上的代码和本地的代码有不同的地方)问题,冲突解决后,再次提交代码。
上面的这种方案其实就是SVN版本控制系统的工作流程,SVN是一种集中式的版本控制系统,
集中式体现在:我们需要一个中央的服务器,工作的时候我们需要先从这个中央服务器获取到
项目当前的最新版本,然后才开始干活,做完后,再把自己的修改推送给中央服务器!
同样也暴露了一个明显的缺点:
需要联网,我们才能够使用SVN,而且会受网络速度的限制,内网还可以,外网的话,
上传速度可能会很慢。另外还有,依赖于中央服务器,假如某天服务器宕机了,那么谁也
无法提交代码...
当然优点也是有的:易于管理,权限管理机制,可以确保安全性。
现在还有一些公司使用SVN进行项目版本管理,而且大部分大学开设的课程讲解的也是SVN,
关于SVN的使用不在此讲解,有兴趣的可自行查阅相关文献~
方案4(Git):我们可以将工程托管到服务器上(比如Github),将它作为远程仓库,
我们一般会在服务端建立两个分支:master分支(保存稳定版),developer分支(平时提交的
代码),然后开发人员根据不同的任务,建立本地分支,在该分支上进行开发,工作完成后
将代码push到developer分支上,假如有冲突,则要先解决冲突,而后还可能需要merge或者
rebase。(PS:关于分支的内容,后面会细讲,别急~)
相比起SVN,Git的优势有以下几点:支持离线提交,更加强大的分支管理等;
Git是一个快速的分布式的版本控制系统,和其他的版本控制系统的差别在于Git直接记录快照,
而不是差异比较!差异比较的版本控制系统只关心文件内容的具体差异,然后每次记录哪些文件做
了更新,以及更新了哪些行的内容!当我们想切换到以前某个版本的时候,我们需要merge,而
Git在每次commit时,都会完整的存储当前版本所有修改的文件,而不是只存储diff,
所以想切换都某个历史版本只需简单的reset即可!
上面我们通过简单的例子引入了Git这个东东,可能你对Git还是有点陌生,有点畏惧,没事,
我们一步步来,把关键点给掌握了,就可以解锁更多姿势了~
2.Git的四个组成部分
我们首先要知道Git由四部分组成,他们分别是:
- 工作区——Working Directory
- 暂存区——Stage(Index)
- 本地历史仓库——Repository
- 远程仓库——Remote
下面我们一一来介绍这四个部分:
首先是工作区,这个就不用说了,我们当前的工作空间;而另外三个部分,我决定举一个
形象化的例子来帮助大家理解,网购的例子,比如我们在逛着某猫:
---> 看到了心仪的物品,我们可以把商品添加到购物车(暂存区),我们可能会频繁的
添加商品(add)或者移除商品(checkout),在这个过程中我们可以随便嗨,反正还没
给钱;
---> 接着我们挑的七七八八了,接着我们就要提交我们的订单了,点击提交订单(commit),
接着会生成一个商品的订单列表(快照),我们还可以在提交的时候添加点备注信息,比如
要什么颜色(commit -m "颜色"),好的,此时订单提交了,但是我们还没支付(Push),
我们可以在自己的账户未支付订单列表(本地仓库)中找到我们的这个订单订单(快照),
也可以看到自己以前的一些订单记录;
---> 再接着我们选择这个还没付款的订单,进行支付(Push),付款完成后,商家(远程仓库)
就会收到这个订单,然后发货...
相信上面的这个例子对你理解Git的四个部分会有所帮助,回到正题,我们简单概括下这四个部分
在日常协作中是如何发挥作用的:
工作区和暂存区:
我们写代码的地方就是工作区,代码写完后,我们可以把他提交到暂存区,提交到暂存区后,我们
可以对自己的代码进行更改,修改文件内容,删除或者增加文件,只需一个git checkout xx即可让
暂存区内容覆盖当前工作区的内容,或者说还原!
暂存区和本地仓库:
我们可以把暂存区的内容提交到我们的本地仓库,此时会在仓库中生成一个快照,我们可以为这个
快照打一个TAG信息,比如这个快照叫"完成了UI部分"这样,提交后暂存区中的内容就会被清空,
此时我们可以调用reset指令,制定某个快照,然后还原到暂存区!
工作区和本地仓库:
我们可以直接走checkout某个版本的指令,直接让工作空间还原成某个本地仓库中的某个快照。
本地仓库和远程仓库:
我们可以将本地的某个快照push推送到远程仓库,push时可能还需处理一些冲突;
也可以从拉取远程仓库到本地,比如我们经常从Github上clone一些开源项目~
工作区和远程仓库:
这两者的协作一般是pull,即同步远程仓库的代码到工作空间而已~
我们把上面的协作内容化成一个流程图,可以帮助我们更好的理解:
3.Git中文件的几个状态
分大类的话,两种状态:Tracked(已跟踪)和Untracked(未跟踪),区分的依据是:
该文件是否已经加入版本控制?当我们在项目中新增一个文件,这个文件此时就处于Untracked状态!
接着我们可以调用git add指令将该文件加入暂存区,那么此时该文件此时处于Tracked状态,又或者说
这个文件已经被我们的版本控制系统所跟踪了,而且他处于Staged(暂存)状态!接着,当我们把
暂存区的文件commit后,此时该文件处于Unmodified(未修改)状态;此时假如我们编辑下该文件,
文件又会变成Modified(修改)状态,接着git add又处于Staged(暂存)状态,然后commit...
文件的变化周期流程图如下:
这里这样说,可能你有些不太了解,没事,打开Android Studio对某个文件做下上述操作,从文件列表
就可以看到明显的颜色变化,比如Untracked是红色,git add后变成蓝色,git commit后变成普通颜色,
关于指令我们下一节讲,你到时自己留意下就知道了~
4.Git的下载安装
好了,关键的概念也就是上面这两点,接下来就是Git的一个下载安装了!
-
Windows系统:
到Git For Windows或者git-for-windows.github.io上下载,然后是傻瓜式的下一步 -
Linux系统:
到Download for Linux and Unix下载,假如你是和我一样的Ubuntu的话直接在Terminal键入:
sudo apt-get install git -
Mac系统:
到Installing on Mac下载
安装完Git后,我们就可以打开Git命令行:
Windows在任意位置右键,点击Git Bash打开Git命令行
Ubuntu下直接打开Terminal就可以,Terminal的快捷键是:ctrl + alt + t
这里说下为什么要使用命令行:
秀,装比必备,啪啪啪敲一堆指令,逼格报表;
减少跨平台使用Git的成本:
比如你熟悉了Win下某个Git的GUI工具,但是加入某一天你要迁移到Linux上,全是命令
行,你怎么玩...或者需要换另一个新的GUI工具,你又需要花时间去熟悉这个工具的使用。
当然还是看自己吧,也没一定要命令行,你也可以用图形化工具,比如后面也会讲下在
Android Studio上使用Git!
网友评论
svn merge -r 当前版本:回退版本 远程仓库地址,大概是这样吧,如果写法
不对,可以指出,谢谢~