开篇

你可能遇到过

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

什么是版本控制

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

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 文章总览图 一.往期回顾 loc='new UiSelector().text("全程班&q ...

  2. 第10.9节 Python子包的导入方式介绍

    在<第10.8节 Python包的导入方式详解>详细介绍了包的导入方式,子包也是包,子包的导入与包的导入方法上没有本质区别,但二者还是有所不同.本节对照二者的方式介绍子包与包导入的关系: ...

  3. 第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反

    一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩 ...

  4. PyQt(Python+Qt)学习随笔:模式窗口的windowModality属性与modal属性

    windowModality属性 windowModality属性只对窗口对象有效,保存的是哪些类型的窗口被模式窗口阻塞. 模式窗口防止其他窗口中的部件获取输入.此属性的值控制对应窗口可见时阻塞哪些类 ...

  5. 【JAVA】SSM开源项目源码--城市学院移动后勤-毕业设计(Spring SpringMvc Mybatis Mui Redis )

    项目简介 大学时期老师给我做的项目,学校后勤管理中心,也作为毕业设计项目. 有 后勤保修 二手交易 失物招领 后勤通知 等功能. 城市学院移动后勤 有APP端(webapp)和WEB端(PC) 后端使 ...

  6. 赶紧收藏!王者级别的Java多线程技术笔记,我java小菜鸡愿奉你为地表最强!

    Java多线程技术概述 介绍多线程之前要介绍线程,介绍线程则离不开进程. 首先 , 进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元: 线程:就 ...

  7. [Windows] 在 Microsoft Docs 网站中挖掘 MVVM 的各种学习资源

    最近写了一些 MVVM 框架的文章,翻了一些 Microsoft Docs 的文档,顺便就对 MVVM 本身来了兴致,想看看更多当年相关的文档.在 MVVM 出现后十多年,我在不同的场合见到过多种 M ...

  8. ORACLE PRAGMA AUTONOMOUS_TRANSACTION 自治事务 单独提交某一段操作

    个人使用示例: CREATE OR REPLACE PROCEDURE logs(p_remark VARCHAR2, p_log CLOB) AS PRAGMA AUTONOMOUS_TRANSAC ...

  9. CSMA系列区别比较:p-pCSMA;CSMA/CA;CSMA/CD

    CSMA系列小结 CSMA,又称载波侦听多路访问协议.在计算机网络课程中,其一共有四个基础协议与两个实际应用(分别是802.11和802.3) 忙 空闲 传输冲突 应用 1-p CSMA 持续侦听,等 ...

  10. 返回sourceString 中出现的第一个 searchString 的索引

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...