git概念及工作流程详解
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
突然发现简书上有好多质量比较高的文章,-----是不是大家知道
git概念及工作流程详解的更多相关文章
- K8s工作流程详解
在学习k8s工作流程之前,我们得再次认识一下上篇k8s架构与组件详解中提到的kube-controller-manager一个k8s中许多控制器的进程的集合. 比如Deployment 控制器(Dep ...
- SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
原文地址:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段:1)客户端向服务器发送一个 ...
- Ansible工作流程详解
1:Ansible的使用者 ------>Ansible的使用者来源于多种维度,(1):CMDB(Configuration Management Database,配置管理数据库),CMDB存 ...
- SSL协议握手工作流程详解(双向HTTPS流程)
参考学习文档:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段: 1)客户端向服务器发 ...
- 看完你也能独立负责项目!产品经理做APP从头到尾的所有工作流程详解!
(一)项目启动前 从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是以为 ...
- Hadoop yarn工作流程详解
yarn是什么?1.它是一个资源调度及提供作业运行的系统环境平台 资源:cpu.mem等 作业:map task.reduce Task yarn产生背景?它是从hadoop2.x版本才引入1.had ...
- Spring MVC 工作流程详解
1.首先先来一张图 开始流程----------------> 1.用户发送请求到前端控制器,前端控制器会过滤用户的请求,例如我们在web.xml里面配置的内容: <!-- 配置Sprin ...
- redux基础概念及执行流程详解
一.执行流程 全局有一个公共的容器(所有组件都可以操作),我们可以在某个组件中把全局容器中的信息进行修改,而只要全局信息修改,就可以通知所有用到该信息的组件重新渲染(类似于发布订阅)==>red ...
- iOS 组件化流程详解(git创建流程)
[链接]组件化流程详解(一)https://www.jianshu.com/p/2deca619ff7e
随机推荐
- Go语言使用PostgreSQL数据库
Go语言使用PostgreSQL数据库 PostgreSQL和MySQL比较,它更加庞大一点,因为它是用来替代Oracle而设计的.所以在企业应用中采用PostgreSQL是一个明智的选择. 现在My ...
- Hadoop: Add third-party libraries to MapReduce job
来自:http://hadoopi.wordpress.com/2014/06/05/hadoop-add-third-party-libraries-to-mapreduce-job/ Anybod ...
- JDK5.0 特性-线程同步装置之Semaphore
来自:http://www.cnblogs.com/taven/archive/2011/12/17/2291474.html import java.util.ArrayList; import j ...
- Android ART runtime简述
此文章原始是PPT格式已转换为PDF,完整内容也能够下载文档阅读: AndroidARTruntimeOverview watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5 ...
- APP注册邀请码
小火箭:MrZOpba685OMLSpanBKFtkxcQf5eGOY 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- ReactNative踩坑日志——如何实现删除scrollview中的视图
在reactNative中,页面是根据state值的变化来重新渲染的.因此,传统的前端开发中通过 id 来移除一个页面元素的做法在这里不适用. 一般,我们是通过遍历数组或map来渲染出scrollvi ...
- JavaIO流原理之常用字节流和字符流详解以及Buffered高效的原理
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的流体系十分庞大,我们来看看体系图: 这么庞大的体系里面 ...
- ODI调用WebService---->OdiInvokeWebService
ODI 提供了OdiInvokeWebService调用第三方WebService,可以在package和过程中使用. 一.准备测试用WebService 天气预报Web服务,数据来源于中国气象局公用 ...
- java与C#、.NET AES加密、解密 解决方案
1.情景展示 Java提供的密钥,C#无法解密. 2.原因分析 在Java中,AES的实际密钥需要用到KeyGenerator 和 SecureRandom,但是C#和.NET 里面没有这2个类, ...
- great tips in soapui
from this site :http://onebyteatatime.wordpress.com/2009/04/18/soapui-tips-n-tricks-part-2/