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
随机推荐
- Ubuntu 12.04.1 mysql从5.5升级到5.6
Ubuntu 12.04.1 mysql从5.5升级到5.6 1 2 3 4 5 apt-cache search mysql-server sudo apt-add-repository ppa: ...
- java动态代理_aop2
一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模 ...
- llvm -O 经历过那些pass
https://stackoverflow.com/questions/15548023/clang-optimization-levels
- WebViewJavascriptBridge源代码分析
近期抽时间看了一遍WebViewJavascriptBridge这个开源框架,把看到的内容记录下来 源代码地址:https://github.com/marcuswestin/WebViewJavas ...
- JVM——字节码增强技术简介
Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步 ...
- pyDes介绍
使用参数如下(拷贝自上述提供的地址): Class initialization -------------------- pyDes.des(key, [mode], [IV], [pad], [p ...
- linux下查看和修改文件时间
一.查看文件时间及相关命令 1.stat查看文件时间 [root@web10 ~]# stat install.log File: "install.log" Size: 3338 ...
- java 生成jar包并保留注释
java 生成jar包并保留注释 CreationTime--2018年7月17日08点32分 Author:Marydon 1.选中java项目-->右键-->Export: 2.去 ...
- 下载完整版Chrome离线安装文件的官方地址
只在自己账号下安装Download Google Chrome Standalone Offline Installer (32-bit) http://www.google.com/chrome/ ...
- 【centos6】给php命令设置全局变量三种方式
方法一:直接运行命令export PATH=$PATH:/usr/local/webserver/php/bin 和 export PATH=$PATH:/usr/local/webserver/my ...