开篇

你可能遇到过

如果你遇到这个场景,那你可能需要版本控制

什么是版本控制

版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了已录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。

—— 版本控制 from 百度百科

版本控制分为集中式、本地式、分布式。

Git:分布式版本控制

git 是一套以键值存储的文件寻址系统。

工作区

Workspace:工作区

Index:暂存区

Repository:仓库

Remote:远程仓库

数据存储原理

SH1A 算法

哈希算法的一种。对文件内容进行计算,可以得到一个哈希值,形如 5453545dccd33565a585ffe5f53fda3e067b84d8

对于内容不同的对象,会计算得到不同的SHA1哈希值。

几种类型文件

Git 目录(.git/objects/)的几种(对象)类型文件:

blob

用来存储文件内容,或者说表示一个(完整的)文件,而不仅仅只是差异存储。

Git 通过使用 zlib 压缩文件,可以有效地压缩文本文件的体积。因此 Git 比较适用于对文本文件的管理,对于二进制文件(比如音频、视频)则压缩比不大。

每个 blob 对象都会通过 SHA1 算法生成哈希值作为指针(或者叫索引、Key等),指向该文件的压缩。

两个一样内容只是名字不同的文件,会共享同一个 blob 对象。因为内容的 SHA1 是一样的。

index

这里说的 index 就是上面说的暂存区的实体存在,其实是一个文件,位于 .git/index ,直接打开会乱码,可以使用命令 git ls-files --stage 查看:

git ls-files --stage
----
100644 92390d97e4159df5c7ef31baf03c8a3378c93395 0 a.txt
100644 ff532afc325d8a07df0e2e3cb37bbee271d05840 0 dirb/b.txt

里面记录了所有跟踪文件的 blob 对象的哈希值,以及文件的路径。

如果文件内容没有改变,index 里则一直指向旧的哈希值。

tree

代表的是目录结构,或者简单理解为代表一个目录。tree 对象也会通过 SHA1 算法生成哈希值作为指针。tree 对象中包含一条或多条 blob 的指针。

目录结构如果是一样的,会共享同一个 tree 对象。

commit

commit 存储一次提交的信息,包括 tree、blob,父节点(的 commit id),以及提交的作者是谁等信息。

commit 的 ID 值就是对对象内容进行 SHA1 算法得到的哈希值。

如何存储数据

git add,生成 blob 文件,同时 index 文件中记录。

git commit 时,根据 index 文件中记录的内容,生成 tree 对象和 commit 对象。

一些概念

分支

体现在目录的 ./git/refs/heads/ 中,这里包含master和一些其他分支文件。每个分支文件保存的是一个 commitID

标签

其实就是保存了 commitID

常用命令

了解了原理后,再回过头来看一些常用的 Git 命令:

git add
git commit
git pull
git push
...

结语

分享个小故事。大家应该都知道 Linux ——世界上最知名的开源操作系统,Android 系统就是基于 Linux 内核开发。它由 Linus Torvalds 在 1991 年发明,并最终经由开源社区的无数个开发者共同开发,至今仍然是最充满生命力的操作系统之一。

2005 年,Linux 开发团队一直使用的商业版本控制系统 BitKeeper 宣布不再免费授权社区使用,Linus 在各种交涉无果后,花了两周时间自己用 C 写了一个分布式版本控制系统并且开源了,一个月之内整个 Linux 系统的源码就交由 Git 管理了。至此之后 Git 迅速成为最流行的版本控制系统之一。2008 年,Github 网站上线,为开源项目免费提供 Git 存储,总多知名项目纷纷迁移至 Github,同时也造福了无数的个人开发者。

开源万岁!

参考

Git 是如何存储文件的

Git底层原理

深入浅出 Git的更多相关文章

  1. 深入浅出Git教程【转载】转载

    深入浅出Git教程(转载)   目录 一.版本控制概要 1.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1 ...

  2. 深入浅出Git教程(转载)

    目录 一.版本控制概要 1.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1.4.3.分布式版本控制 1.5 ...

  3. 深入浅出git

    图文 http://www.cnblogs.com/syp172654682/p/7689328.html 廖雪峰 https://www.liaoxuefeng.com/wiki/001373951 ...

  4. 深入浅出Git(偏向理论)

    目录 一.理论概述 1. 什么是Git 版本控制系统分类 2. GitLab和GitHub是什么 3.Git功能 二.结合具体命令了解其工作 1.环境 2.部署 Git仓库的使用 简单命令解释 Git ...

  5. Git 相关工具及教程地址

    一.Git GUI 客户端 Git 客户端下载(Windows) TortoiseGit 客户端下载(Windows) Sourcetree 客户端下载(Windows.Mac) Git Extens ...

  6. Git的使用以及常用命令(详解)

    一. 版本控制工具 什么是版本控制系统? 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版 本修订情况的系统.版本控制系统不仅可以应用 ...

  7. 使用 Jenkins 搭建 iOS/Android 持续集成打包平台【转】

    背景描述 根据项目需求,现要在团队内部搭建一个统一的打包平台,实现对iOS和Android项目的打包.而且为了方便团队内部的测试包分发,希望在打包完成后能生成一个二维码,体验用户(产品.运营.测试等人 ...

  8. CI Weekly #16 | 从另一个角度看开发效率:flow.ci 数据统计功能上线

    很开心的告诉大家,flow.ci 数据统计功能已正式上线. 进入 flow.ci 控制台,点击「数据分析」按钮,你可以按照时间日期筛选,flow.ci 将多维度地展示「组织与项目」的构建数据指标与模型 ...

  9. Git 深入浅出

    如果你是一个开发人员,想用上这个世界上目前最先进的分布式版本控制系统,那么,赶快开始学习吧!(耐心读下去,收获满满) Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git ...

随机推荐

  1. 【jvm】MinorGC和FullGC

    新生代GC(Minor GC)指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快. 老年代GC(MajorGC/Full GC) ...

  2. Pytest自动化测试 - allure报告进阶

    Allure除了具有Pytest基本状态外,其他几乎所有功能也都支持. 1.严重性 如果你想对测试用例进行严重等级划分,可以使用 @allure.severity 装饰器,它可以应用于函数,方法或整个 ...

  3. 2014.04.28基于CPLD的LCOS场序彩色视频控制器设计

    基于CPLD的LCOS场序彩色视频控制器设计 作者:宋丹娜,代永平,刘艳艳,商广辉 发表刊物:液晶与显示,2009 学习时间:2014.04.28 文章讲述了-- (和上一篇论文有些相似之处) 1. ...

  4. Android自带图标库

    Java Usage example: myMenuItem.setIcon(android.R.drawable.ic_menu_save); Resource Usage example: and ...

  5. macos brew zookeeper,安装后zookeeper启动失败?

    一.Zookeeper安装流程 执行如下安装命令: brew install zookeeper 执行截图如下: 安装后查看 zookeeper 安装信息(默认拉取最新版本) brew info zo ...

  6. 洛谷P3901 数列找不同(莫队水题)

    重温下手感,判断区间是否全是不同的数字有两种做法,一个长度为len的区间不同的数字,参见HH的项链,一种是区间众数,参见蒲公英,是水题没错了.明天搞数据库,然后继续自己的gre和训练计划 #inclu ...

  7. 最常用的分布式ID解决方案,你知道几个

    一.分布式ID概念 说起ID,特性就是唯一,在人的世界里,ID就是身份证,是每个人的唯一的身份标识.在复杂的分布式系统中,往往也需要对大量的数据和消息进行唯一标识.举个例子,数据库的ID字段在单体的情 ...

  8. PyQt学习随笔:ListView控件增加列表项

    ListView控件如果需要增加列表项,就是在对应数据存储中插入项,这又分两种情况,一种是已知列表数据存储,一种是未知数据存储.如果是未知数据存储,可以通过: ListView控件名.model() ...

  9. 第15.14节 PyQt(Python+Qt)入门学习:Designer的Buttons按钮详解

    一.引言 Qt Designer中的Buttons部件包括Push Button(常规按钮.一般称按钮).Tool Button(工具按钮).Radio Button(单选按钮).Check Box( ...

  10. 自动化运维工具之Puppet master/agent模型、站点清单和puppet多环境设定

    前文我们了解了puppe中模块的使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14086315.html:今天我来了解下puppet的master/age ...