【软件构造HIT】Git的工作原理思考及简单使用方法

Git工作原理思考及Git的简单使用方法

  • Git是什么

Git 是一个免费并且开源的分布式版本控制系统,旨在快速高效地处理从小到大所有项目的版本管理,在软件的版本控制过程中具有重要的作用。Git是目前最流行、最先进的分布式版本控制系统,就算不使用Git,如果使用Github的话,也必然要用到Git,所以了解Git的工作原理和Git的使用方法是非常必要的。正好由于本课程讲解了Git的工作原理以及Git的简单实用方法,在此处记录一下本人学习本课程后对于Git的理解与思考。

  • Git的工作原理
  1. Git仓库

Git在使用时将软件分为四个库:①workspace,即自己的工作目录(自己写的代码);②暂存区staging,存储那些已经添加追踪但是还没有提交到本地仓库的文件;③本地仓库local repository,暂存区的文件提交后就存储在Git的本地仓库中;④远程仓库remote repository,在个人理解中即为Github中的仓库。

在使用Git时,文件共有三种不同的状态:①已修改:即文件只在自己计算机中的工作目录中修改,没有添加到暂存区也没有提交到本地仓库中;②已暂存:即修改后的文件已经通过git add命令添加到暂存区,在暂存区已经存在了一份修改后的文件;③已提交:即暂存区的文件通过git commit命令已经提交到了Git的本地仓库。

  1. 对象图(Object graph)

Git的操作在一个图数据结构中进行,我们将这个图称为对象图(Object graph)。Git的所有操作,包括clone,add,commit,push,merge等各种操作,都是基于对象图这一种数据结构来实现的。Git的这个对象图一般存储在.git目录中。

那么一个对象图一般是一个什么样的形式呢?下面这个图给出了一个对象图的示例:

图中“A→B”表示的是版本A是在版本B的基础变化下形成的版本。

在对象图中,一般情况下一个commit指向一个父亲,表示这个commit是在父亲的基础上变化修改形成。此外还可能有多个commit指向同一个父亲的情况,这种情况我们成为分支,表示这多个commit都是在同一个父亲版本的基础上变化修改得来的;也可能出现一个commit指向两个父亲的情况,说明这个commit是在这两个父亲的基础上通过合并merge得到的版本,merge可以将两个或多个版本merge成一个新的版本。

而对象图中的节点表示如下信息:每一个commit用一个树中的节点来表示。这个节点中包含了一个128位的哈希值,但一般只通过前几位每个commit特殊的值就可以标识这个commit。此外这个节点信息还包含了作者、版本号、哪次提交等多种信息,树节点中存储了具体文件存储的指针,存储具体文件时,与之前版本中没有变化的文件,不需要重复存储,只需要将没有变化的文件的指针指向之前版本中没有变化的这个文件就可以了,这个部分的具体内容将在后续内容通过图示具体展示。

  1. Git与其他版本控制工具管理变化的不同
  • 传统的版本控制工具:

在传统的控制工具中是通过记录不同版本中变化的代码行来实现管理变化的,以下图变化的过程为例:

在Version1中保存了最初始的文件A,B,C;

在Version2中记录了文件A的变化Δ1,文件C的变化Δ1;

在Version3中记录了文件C的变化Δ2;此后又添加了新的变化,下面我们以获取这个软件的Version3为例:先获得文件A,B,C,在Version3之前发现文件1有变化Δ1,将变化Δ1变化的代码行更新到软件的文件A中,在发现文件C有变化Δ1和Δ2,将变化Δ1和Δ2变化的代码行更新到软件的文件C中,而文件B中没有代码行的变化所以不用更新,在这个过程之后我们就获得了这个软件的Version3。

但是传统的配置管理工具这种管理变化的机制需要扫描所有的变化并将它们一一添加到文件中,速度较慢,是一个比较大的缺点。

  • Git作为版本控制工具:

在Git中存储的是发生变化的文件,存储的是发生变化整个文件,并且没有变化的文件不需要重复存储,在获取版本时只需要直接使用文件即可。同样以获取软件的Version3为例:只需要获取Version3对应的文件A1,B,C2即可获得软件的Version3,不需要像传统的版本控制工具一样寻找变化的位置并更新,所以速度较快,更加方便,同时不变化的文件不重复存储也不会造成过多额外的空间开销。

Git是如何实现只存储发生变化的文件的机制如下图所示:实际上只需要修改对象图中的节点的指针即可。

  1. 创建及合并分支

下面以一个图示来表示创建及合并分支的过程:

其中checkout命令的效果类似于cd指令,为切换目录。在合并的过程中需要考虑它们的公共祖先版本,如果其中有其他的版本则需要创建一个新的分支再将两个版本合并,如图示中C6的形成;同时如果在合并时如果出现冲突的情况,则需要人工消解冲突。

  • Git的使用
  1. Git的常用命令
  • git init:需要对某个项目或目录进行Git管理时,创建一个Git仓库,进入项目所在目录;
  • git add:想要将某些文件加入到软件配置管理的时候,有git add命令;
  • git commit:需要将当前这个阶段惊醒提交的时候,用git commit -m ‘注释或说明’格式的指令;
  • git status:用来确定那些文件当前处于什么状态,可以用来观察当前目录中文件那些没有被跟踪,哪些已经被跟踪了等信息;
  • git diff:用来查看具体修改了什么地方,查看尚未暂存的文件更新了哪些部分;
  1. 个人使用Git的本地操作模式

个人使用Git进行软件版本控制时,一般为以下流程:①通过git init命令创建仓库;②通过git add命令告诉git对哪些文件进行跟踪;③通过git commit命令将已暂存的文件提交到本地仓库。

  1. 不同开发人员通过Git进行合作的模式

不同人员通过Git共同开发时,首先用git clone命令克隆;每一次开发之前通过git fetch或git pull先将其他人员的最新成果拉到自己的本地目录,之后自己再进行自己的开发工作,在自己这一时间段的开发工作完成之后再通过git push让别人知道自己的工作成果。

  • 总结

Git作为世界上最先进、最流行的版本控制系统,是每一个程序员必须要了解原理并掌握使用方法的工具。对于程序员来说,使用Git以及Github是必须要具备的能力,也是程序员不断学习和丰富自己的重要途径。在通过课程了解并思考了Git的工作原理后,我们更需要在后续的实验与学习中使用,熟练掌握Git的使用方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值