开篇

你可能遇到过

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

什么是版本控制

版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了已录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(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. Kafka入门之consumer--rebalance流程

    重平衡(rebalance) 旧版本Kafka依托于Zk进行rebalance,新版本consumer使用了Kafka内置的一个全新的组协调协议.对于每个组而言,Kafka的某个broker会被选举为 ...

  2. 网络拓扑实例之交换机基于全局地址池作为DHCP服务器(七)

    组网图形 DHCP服务器简介 通常用户希望网络中的每台终端能够动态获取IP地址.DNS服务器的IP地址.路由信息.网关信息等网络参数,不需要手动配置终端的IP地址等网络参数:另外,针对一些移动终端(手 ...

  3. uni-app 封装接口request请求

    我们知道一个项目中对于前期架构的搭建工作对于后期的制作有多么重要,所以不管做什么项目我们拿到需求后一定要认真的分析一下,要和产品以及后台沟通好,其中尤为重要的一个环节莫过于封装接口请求了.因为前期封装 ...

  4. ubantu+nginx+uwsgi+django部署

    1.更新ubantu的apt apt-get update 必要时候更新系统:      apt-get upgrade 2.远程连接服务器 ssh 用户名@ip 上传代码 :        scp ...

  5. [翻译自官方]什么是RDB和AOF? 一文了解Redis持久化!

    ​概述 本文提供Redis持久化技术说明,  建议所有Redis用户阅读. 如果您想更深入了解Redis持久性原理机制和底层持久性保证, 请参考文章 揭秘Redis持久化: http://antire ...

  6. JDK8日期类入门

    关于jdk8的时间类的用法,网上有很多教程教你如何用,比如: System.out.println(LocalDateTime.now()); 可以获取当前的时间, 2020-12-06T18:02: ...

  7. 缩减项目代码中的大面积if策略

    参考设计模式 - 策略模式我们可以优化if-else代码段,而在Spring(Boot)中,借助ApplicationContext扫描,可以使代码更加干净. 话不多说,亮代码: 首先按照策略模式的写 ...

  8. Azure Cosmos DB (五) .Net Core 控制台应用

    一,引言 之前在讲Azure CosmosDB Core(SQL)核心的时候,使用了EF Core 的方式,引用了 "Microsoft.EntityFrameworkCore.Cosmos ...

  9. django学习——request.POST.get(‘key’) 、 request.GET.get('key', '')

    request.POST是用来接受从前端表单中传过来的数据,比如用户登录过程中传递过来的username.passwrod等字段.返回类型是字典: 在后台进行数据获取时,有两种方法(以username ...

  10. 【面试题】在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)

    整个流程如下: 域名解析 为了将消息从你的PC上传到服务器上,需要用到IP协议.ARP协议和OSPF协议. 发起TCP的三次握手 建立TCP连接后发起HTTP请求 服务器响应HTTP请求 浏览器解析h ...