zoukankan      html  css  js  c++  java
  • 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资源

    学习过程中我参考了许许多多的教程,分享跟大家:

    git教程

    廖雪峰git教程

    git–简易指南

    猴子都能懂的GIT入门

    Git参考手册

    参考:

    http://www.jianshu.com/p/c05231e6a65a

    http://www.jianshu.com/p/bfec042349ca

    http://www.jianshu.com/p/cf97aa1581ab

    突然发现简书上有好多质量比较高的文章,-----是不是大家知道

  • 相关阅读:
    java.lang.String 的 + 号操作到底做了什么事情?
    我的【Java】面试日记
    ReentrantLock源码学习总结 (二)
    ReentrantLock源码学习总结 (一)
    【Dubbo】带着问题看源码:什么是SPI机制?Dubbo是如何实现的?
    假如 Redis Cluster 模式用在 T-io 上
    Win10下安装tensorflow详细过程
    Python 3.7 使用pyhive (坑)
    ARIMA
    AttributeError: 'Series' object has no attribute 'ix'
  • 原文地址:https://www.cnblogs.com/tsingke/p/7350490.html
Copyright © 2011-2022 走看看