Git工作原理

Git工作原理

Git分层操作

        git的工作总共分四层,其中三层是在自己本地上进行操作即工作区、暂存区和本地仓库。

        工作区(workspace)就是我们执行命令git init时所在的地方,也就是我们执行一切文件操作的地方;

        暂存区(index)和本地仓库(repository)都是在.git目录下,因为它们只是用来存数据的。

        远程仓库(remote)在中心服务器,也就是我们做好工作之后推送到远程仓库,或者从远程仓库更新下来最新代码到本地。远程仓库仅仅是用来方便成员交换修改,如果没有这种需求,个人认为远程仓库是非必要的。

  他们的关系如下:

  Git所存储的都是一系列的文件快照,然后git 来跟踪这些文件快照,发现哪个文件快照有变化他就会提示你需要添加到暂存区或是提交到本地仓库来保证你的工作目录是干净的。

git中的文件有两种状态

  一种是被跟踪的(Tracked),也就是提交到本地仓库的文件,因为本地仓库要保管它们当然要跟踪他们,对他们负责;另一种就是未被跟踪的(Untracked),当我们添加新的文件时,他是未被跟踪的,因为本地仓库里面没有这个文件,他是外来的,本地仓库目前还不需要对他们负责。可以通过git status查看他们的状态来进行相应的操作。当然我们也可以生成一个.gitignore文件,里面指定要忽略的文件类型,然后这些文件就不会被跟踪,不管怎么改变他们,git status都不会提示你需要做什么操作。

  被跟踪的文件分为三种,分别是staged,modified,unmodified,它们的关系如下:

fiel state

        所以当我们在工作目录中进行文件操作后,要先添加到暂存区,然后再将暂存区中刚添加的文件快照提交到本地仓库,然后再将本地仓库的最新状态文件快照推送到远程仓库。这个文件快照其实就是各个文件在被添加到暂存区时的状态,就和照相的一样,留下每个不同时刻的快照,方便以后查询,而git存储的就是这些一系列的快照。说到这个快照就要说说git的对象了。

Git对象

       从根本上讲,git是一套内容寻址的文件系统,它存储的也是key-value键值对,然后根据key值来查找value的,说到寻址就会想到指针吧,不错,git也是根据指针来寻址的,这些指针就存储在git的对象中。Git一共有四种对象,commit对象,tree对象和blob对象和tag对象,这里可以理解tag是commit的别名,下面便是这三个对象:

        每个目录都创建了“tree”对象, 每个文件都创建了一个对应的“blob”对象。最后有一个“commit”对象来指向根“tree”对象,这样我们就可以追踪项目每一项提交内容。 这个blob对象对应的就是文件快照中那些发生变化的文件内容,而tree对象则记录了文件快照中各个目录和文件的结构关系,commit对象则记录了每次提交到本地仓库的文件快照。

      在开发过程中,我们会提交很多次文件快照,那么第一次提交的内容会用一个commit来记录,这个commit 没有指针指向上一个commit对象,因为没有上一个commit,他是第一个,当第二次提交时,又会有另外一个commit对象来记录,那么这次commit对象中就会有一个指针指向上一次提交后的commit对象,经过很多次提交后就会有很多的commit对象,它们组成了一个链表,当我们要恢复哪个版本的时候,只要找到这个commit对象就能恢复那个版本的文件。而我们所谓的HEAD对象其实就是指向当前分支,而当前分支指向了最近一个提交的commit对象,也就是最后一个commit对象。

git操作流程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值