Git 之二 架构、工作流程、.git 目录文件

写在前面

  Git 的官网上有很详细的使用教程(当然有翻译版本),具体地址是 https://git-scm.com/book/zh/v2。唯一不足就是,很多讲解并没有实机演示。但是,毫无疑问,官网资料是最全面的!如果有任何疑问,可以去官网看看!

架构

  Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
在这里插入图片描述
  Git 不按照以上方式对待或保存数据。 Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git 对待数据更像是一个快照流
在这里插入图片描述
  Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。

  Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。

  Git 管理的文件有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。

  • 工作目录: 就是 Git 管理的文件夹。
  • 暂存区域: 暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录(.git)中。 有时候也被称作“索引”。
  • Git 仓库: Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。主要就是我们工作目录中的 .git 文件夹所在的文件夹

工作流程

根据是否使用远程仓库,工作流程可以分本地工作流程和远程工作流程。

本地工作流程

主要是指的对于本地仓库的各种操作!如下图所示:
在这里插入图片描述
下面是实际的 Git 命令示例:

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3
$ git init
Initialized empty Git repository in E:/N_W_Z/N_W_Z_3/.git/

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ vim a.txt

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        a.txt

nothing added to commit but untracked files present (use "git add" to track)

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git add a.txt
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   a.txt


ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git commit -m "新增"
[master (root-commit) ba06d60] 新增
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git status
On branch master
nothing to commit, working tree clean

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$

远程工作流程

  主要是指的本地仓库与远程仓库的关联同步的问题。在关联了远程仓库后,我们本地仓库有变动之后,通常还需要将变动推送到关联的远程仓库。下图是一个使用 Git 开源项目的典型工作流程:
在这里插入图片描述

  1. 一个本地仓库可以关联多个远程仓库
  2. 每个本地仓库都是包含完整的远程仓库内容

.git 目录解析

  在 Git 仓库初始化之后,会在指定的目录下生一个名为 .git 的文件夹。这个文件夹是个隐藏目录,Windows 系统需要开启显示隐藏才能看到!对于.git 所在的仓库的所有操作,都会记录在该文件中的各文件中。下面我们就来分析一下这个目录。

  • hooks 文件夹 :主要定义了客户端或服务端钩子脚本,这些脚本主要用于在特定的命令和操作之前或者之后进行特定的处理,该文件夹下是一个默认的模板
    在这里插入图片描述
    比如:当把本地仓库 push 到服务器的远程仓库时,可以在服务器仓库的 hooks 文件夹下定义 post_update 脚本,在该脚本中可以通过脚本代码将最新的代码部署到服务器的 web 服务器上,从而将版本控制和代码发布无缝连接起来;
  • info 文件夹: 保存了一份不希望在 .gitignore 文件中管理的忽略模式的全局可执行文件
  • logs 文件夹: 记录了本地仓库和远程仓库的每一个分支的提交记录,即所有的 commit 对象(包括时间、作者等信息)都会被记录在这个文件夹中,因此这个文件夹中的内容是我们查看最频繁的,不管是Git log命令还是tortoiseGit的show log,都需要从该文件夹中获取提交日志;
  • objects 文件夹: 该文件夹主要包含 git 对象。Git 中的文件和一些操作都会以 git 对象来保存,git 对象分为 BLOB、tree 和 commit 三种类型,例如 git commit 便是 git 中的 commit 对象,而各个版本之间是通过版本树来组织的,比如当前的 HEAD 会指向某个 commit 对象,而该 commit 对象又会指向几个BLOB 对象或者 tree 对象。
    • 13、21 等文件夹: Git 对象保存在以其 sha-1 值的前两位为文件夹名,后 38 位为文件名的文件中;Git 为了节省存储对象所占用的磁盘空间,会定期对 Git 对象进行压缩和打包!
    • pack 文件夹: 用于存储打包压缩的对象。
    • info 文件夹: 用于从打包的文件中查找 git 对象。
  • refs 文件夹: 该文件夹存储指向数据(分支)的提交对象的指针。
    • heads 文件夹: 存储本地每一个分支最近一次 commit 的 sha-1 值(也就是commit对象的sha-1值),每个分支一个文件;如下图所示:
      在这里插入图片描述
      上图示例中, 分支 Dev 和 Feature 都是从 master 分支创建的,并且都还没有任何提交,因此它们目前都执行同一次提交记录。当在不同的分支进行提交之后,它们将指向不同的提交记录。
  • COMMIT_EDITMSG: 一个纯文本文件,记录了最后一次 commit 时的注释信息。
  • config: 该文件主要记录针对当前代码仓库的一些配置信息,这个就是仓库级别的配置文件,其中的内容会覆盖用户级配置文件中的同名内容。例如,是否以 bare 方式初始化、remote 的信息等,通过 git remote add 命令增加的远程分支的信息就保存在这里;
    在这里插入图片描述
  • FETCH_HEAD: 一个纯文本文件,记录了每个分支最后一次与远程仓库服务器通信的最后一个 commit 的 SHA1 值
    在这里插入图片描述
  • HEAD: 一个纯文本文件,该文件指向当前分支,标识了当前工作区所在的分支。比如当前分支是 master,则该文件就会指向 master。但是,并不是存储一个 master 字符串,而是分支在 refs 中的表示,例如 ref: refs/heads/master。如下图所示:
    在这里插入图片描述
  • ORIG_HEAD: 一个纯文本文件,记录了同步当前分支与远程仓库分支时最后一个 commit 的 SHA1 值
  • description:一个纯文本文件,仓库描述,仅供 GitWeb 程序使用
  • index: 该文件保存了暂存区域的信息。该文件某种程度代表了暂存区(staging area),内容包括它指向的文件的时间戳、文件名、sha1 值等;可以使用 git ls-files 来查看内容。
    在这里插入图片描述
  • packed-refs: 将 refs 下文件进行打包到一个文件,一般是每个分支最后一个修改集

参考

  1. https://git-scm.com/docs
  2. https://www.cnblogs.com/yelbosh/p/7471979.html
  3. https://developer.aliyun.com/article/761663
  4. https://www.cnblogs.com/yinn/archive/2018/01/23/7641507.html
  5. http://blog.didispace.com/gitflow-info/
  6. https://nvie.com/posts/a-successful-git-branching-model/
  7. https://blog.csdn.net/aqin1012/article/details/123848319
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZC·Shou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值