Git 分布式版本控制系统

目录

文章目录

  • 目录
  • Git 分布式版本控制系统
  • Git 的基本概念
  • Git 的仓库结构
  • Git 的核心对象
  • Git 的数据结构
  • Git Flow
  • 参考文档

Git 分布式版本控制系统

Git 是一个免费的、开源的分布式版本控制系统(Version Control System),本质是一个内容寻址文件系统(Content addressable filesystem)。即:Git 的核心是一个简单的键值对数据库(Simple key-value data store)。

你可以向 Git 插入任意类型的内容,它会返回一个键值(Hash,SHA-1 散列),通过该键值可以在任意时刻再次检索该内容,而这些数据全部是存储在 .git/objects 目录内。

Git 的基本概念

Git 分布式版本控制系统_第1张图片

Git 分布式版本控制系统_第2张图片

  • Working Area:本地工作区,对应的文件状态是 Modified(已修改)但还没保存到数据库中。
  • Index/Stage:本地暂存区,对应的文件状态是 Staged,Git 已经对该文件做了标记,下次提交就知道要包含它了。
  • Local Repository:本地仓库,存放本地历史版本信息。对应的文件状态是 Committed,文件已经安全的保存在本地数据库中。
  • Remote Repository:远程仓库。
  • HEAD:当前版本指针,上一个版本是 HEAD^,以此类推。

Git 的仓库结构

一个完整的 Git 仓库也就是 .git 目录,在这个 Local Repo 中存储了 Git 所有的模型对象。

Git 分布式版本控制系统_第3张图片

Git 的核心对象

Git 主要有四个对象,分别是 Blob、Tree、Commit、Tag 他们都用 SHA-1 Key 进行命名。

  • Key:是一个由 40 个十六进制字符组成的字符串。前两个字符用于命名子目录,余下的 38 个字符则用作文件名,这样处理是因为检索优化策略,提高文件系统效率。

  • Value

    • Commit:Actual git commits(提交)= Tree + Blob 的 Snapshot(被追踪的最顶层的 Tree)。
    • Tree:Directoy(目录树),就是一个文件夹。
    • Blob:file content(文件内容),就是单个的文件。
    • Tag:是一个 “固化的分支”,一旦打上 tag 之后,这个 tag 代表的内容将永远不可变,因为 tag 只会关联当时版本库中最后一个 commit 对象。

Git 分布式版本控制系统_第4张图片

注:Branch 与 Tag 不同,Branch 会随着不断的提交,内容会不断的改变,因为分支指向的最后一个 Commit 不断改变。所以一般应用或者软件版本的发布一般用 Tag。

Git 分布式版本控制系统_第5张图片

Git 的数据结构

Git 记录了每个 Snapshot 的 Parent,也就是当前这个目录的上一个版本。那么 Snapshot 迭代更新的过程就可以表示为一个有向无环图。

Git 分布式版本控制系统_第6张图片

每个快照都对应了一次 Commit,这就是 Git 的数据模型:

class commit {
     
	array<commit> parents
	String author
	String message
	Tree snapshot
}

Git Flow

Git 分布式版本控制系统_第7张图片

最简单的 Git Flow 主要有三步:

  1. 在工作区修改文件。
  2. 将文件的快照放入暂存区。
  3. 找到暂存区的文件,将快照永久性存储到 Local Repo。

Git 分布式版本控制系统_第8张图片

详细的说,Git Flow 的项目存在两个长期分支。

  1. 主分支(Master branch):存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版;
  2. 开发分支(Develop branch):用于日常开发,存放最新的开发版。

其次,项目存在三种短期分支,一旦完成开发,它们就会被合并进 Develop 或 Master branch,然后被删除:

  1. 功能分支(Feature branch)
  2. 补丁分支(Hotfix branch)
  3. 预发分支(Release branch)

Git Flow 的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支。这个模式是面向 “版本发布” 的,并不适用于 “持续发布(代码一有变动,就部署一次)” 的场景。

参考文档

https://mp.weixin.qq.com/s/l5JU9e6_HrS_-ixiBIrqsA

你可能感兴趣的:(Git,版本控制)