git概念及工作流程详解
既然我们已经把gitlab安装完毕【当然这是非必要条件】,我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别及理解git几个重要概念。
至于什么是git,git的发展历史,网上已经有很多资料,可以自行google或百度。
关于git与svn的区别
这里不针对git与svn的区别详细深究,以便对双方的优缺点了解更多些。
1) 最核心的区别Git是分布式的,而Svn不是分布的。
能理解这点,上手会很容易,声明一点Git并不是目前唯一的分布式版本控制系统,还有比如Mercurial等,所以说它们差不许多。话说回来Git跟Svn一样有自己的集中式版本库和Server端,但Git更倾向于分布式开发,因为每一个开发人员的电脑上都有一个Local Repository,所以即使没有网络也一样可以Commit,查看历史版本记录,创建项 目分支等操作,等网络再次连接上Push到Server端。
2)Git把内容按元数据方式存储,而SVN是按文件。
Git关心文件的整体是否发生变化,而SVN则关心的是文件内容的具体差异!
SVN每次记录的是有哪些文件进行了修改,以及修改了哪些行的哪些内容:
比如版本2中记录的是文件A以及文件C的变化,而版本3中仅仅记录文件C的变化这样,以此类推;而Git并不保存这些前后变化的差异数据,而是保存整个当前的工作空间(暂存区)所有文件,又叫快照,有变化的文件保存,没变化的文件就不保存,而是对上一次保存的快照作一个链接。
如上图,每一次保存的都是所有文件,改变的保存,没改变的链接指向上一次提交的文件!因为这种不同的保存方式,Git切换分支的速度比SVN快几条街!
3) Git没有一个全局版本号,而SVN有。
目前为止这是跟SVN相比Git缺少的最大的一个特征。
4)GIT分支和SVN的分支不同。
在SVN,分支是一个完整的目录。且这个目录拥有完整的实际文件。如果工作成员想要开啟新的分支,那将会影响“全世界”!每个人都会拥有和你一样的分支。如果你的分支是用来进行破坏工作(安检测试),那将会像传染病一样,你改一个分支,还得让其他人重新切分支重新下载,十分狗血。
而 Git,每个工作成员可以任意在自己的本地版本库开啟无限个分支。举例:当我想尝试破坏自己的程序(安检测试),并且想保留这些被修改的文件供日后使用, 我可以开一个分支,做我喜欢的事。完全不需担心妨碍其他工作成员。只要我不合并及提交到主要版本库,没有一个工作成员会被影响。等到我不需要这个分支时, 我只要把它从我的本地版本库删除即可。无痛无痒。
Git的分支名是可以使用不同名字的。例如:我的本地分支名为OK,而在主要版本库的名字其实是master。
当然SVN与GIT不只是这个点上的不同,还又还多不同,可以找度娘。
另外提下Git每次commit时候,在仓库中的数据结构。
如上图,Blob对象存储的是文件的快照内容,tree对象则是记录快照索引的目录 .当然,上面的内容知道下就好了,也不必过于深究,好的,开始学习本节Git分支的相关内容吧~
git的工作流程
主要流程就是
首先将远程代码仓库clone下来,在本地建立的一个代码仓库。
修改项目代码,如修改bug,增加新的功能等。
然后Pull,将远程仓库的项目下载到本地。
等你写好自己的代码后,先add/commit到本地的仓库。
最后push到远程的代码仓库中。
git的几个重要概念
我们首先要知道Git由四部分组成,他们分别是:[本部分转自coder_pig]
工作区——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,即同步远程仓库的代码到工作空间而已~
Git中文件的几个状态
分大类的话,两种状态:Tracked(已跟踪)和Untracked(未跟踪),区分的依据是:
该文件是否已经加入版本控制?
当我们在项目中新增一个文件,这个文件此时就处于Untracked状态!
接着我们可以调用git add指令将该文件加入暂存区,那么此时该文件此时处于Tracked状态。
又或者说这个文件已经被我们的版本控制系统所跟踪了,而且他处于Staged(暂存)状态!
接着,当我们把暂存区的文件commit后,此时该文件处于Unmodified(未修改)状态;
此时假如我们编辑下该文件,文件又会变成Modified(修改)状态,接着git add又处于Staged(暂存)状态,然后commit...
文件的变化周期流程图如下:
另外关于HEAD
HEAD,头,它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变。
即在commit,reset等改变当前版本号时,都会使得当前分支的HEAD移动到当前版本的提交点。
checkout切换分支后,HEAD会指向被检出分支的最后一次提交点。
这里这样说,可能你有些不太了解,没事,多用用,观察下文件的变化,就会熟悉文件之间的状态变化了。
附:学习git资源
学习过程中我参考了许许多多的教程,分享跟大家:
参考:
http://www.jianshu.com/p/c05231e6a65a
http://www.jianshu.com/p/bfec042349ca
http://www.jianshu.com/p/cf97aa1581ab
突然发现简书上有好多质量比较高的文章,-----是不是大家知道