一、前言
上篇文章我们讲到对版本控制系统——svn以及git的区别及优点,对于git来说,每个执行过git clone的文件夹都是一个完整的仓库,也可以说是“容灾”了啊哈哈。
这次将提出我们当前git在工作中的整个使用流程,以及git文件夹的初探。
二、正文
作为当前git的工作流程,我决定分为(逻辑)流程和(物理)流程,这两个都是我自己起的名字,并不专业。只是对使用git 的逻辑以及实际流程做的一个概述。
逻辑流程
如下图所示:我们在执行的最开始,都只有一个远程仓库,在我们执行完git clone之后,便可以与远程建立起联系,并且还能创建文件夹以及复制代码,可见git clone操作是一个“复合”操作,那么git clone由哪几部分组成呢?
git clone = mkdir foo 创建文件夹
cd foo 进入文件夹
git init 初始化git目录
git remote add origin REMOTEURL 添加远程仓库
git pull origin master 拉取代码
如上,在使用git clone之后,我们就与远程仓库建立了关系,就可以执行如上图所示的一些流程。
在我们做完clone之后,就可以在工作区进行操作了,对于在工作区中操作后的文件,使用git add加入暂存区stage;
在完成了一次完整的提交时,使用commit将当前所有暂存区中的差异文件提交至本地仓库,这就其实已经完成了一个本地仓库的完整的提交;
这时候我们想将当前的工作内容同步更新至远程,如果当时远程仓库已经被其他小伙伴更新过,就需要使用fetch,拿到远程仓库的更新,并且使用merge或 者rebase合并远程仓库的这些提交,最后将自己的本地仓库提交至远程,这个是我们整个的逻辑操作流程。
push规则:
为什么如果远程仓库被其他小伙伴提交过之后,就不允许我们直接提交,而是需要更新之后才能提交呢?这就涉及到了git的同步push操作的规则,即如果将本地的更新push至远程,需要遵循的规则是,本地必须要比远程的提交多才可以,也就是说发起主动push的一方,要比被push的一方的提交领先才可以。
物理流程
针对于物理流程(也是我自己起的名字啊),如下图所示:,在git init的时候,生成了本地仓库的版本库,我们每次的add以及commit都是在向里面增加文件以及提交记录。
这个就在主文件夹的.git目录下,打开这个目录,可以看到以下一大堆文件,分别有以下的作用:
hooks里面有git执行的部分脚本;
而logs中包含了所有的指针记录;
objects是生成的所有对象;
HEAD是当前工作目录的指向,也就是代表了当前工程的分支以及分支的提交点;
index是二进制文件形式存储的暂存区。
这个.git目录就是当前git仓库的所有数据,他也标志着我们操作系统中的git程序识别的唯一目录,因此如果想当前目录取消应用于git,直接删除即可。
三、结语
这篇博客主要总结了我们在工作中使用git 的整体流程,并中逻辑以及物理的两个角度进行了较为浅显的分析,下篇我们将对git中最重要的分支及其合并操作进行深入的分析。