深入浅出 Git
开篇
你可能遇到过

如果你遇到这个场景,那你可能需要版本控制。
什么是版本控制
版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了已录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
版本控制分为集中式、本地式、分布式。
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.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1 ...
- 深入浅出Git教程(转载)
目录 一.版本控制概要 1.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1.4.3.分布式版本控制 1.5 ...
- 深入浅出git
图文 http://www.cnblogs.com/syp172654682/p/7689328.html 廖雪峰 https://www.liaoxuefeng.com/wiki/001373951 ...
- 深入浅出Git(偏向理论)
目录 一.理论概述 1. 什么是Git 版本控制系统分类 2. GitLab和GitHub是什么 3.Git功能 二.结合具体命令了解其工作 1.环境 2.部署 Git仓库的使用 简单命令解释 Git ...
- Git 相关工具及教程地址
一.Git GUI 客户端 Git 客户端下载(Windows) TortoiseGit 客户端下载(Windows) Sourcetree 客户端下载(Windows.Mac) Git Extens ...
- Git的使用以及常用命令(详解)
一. 版本控制工具 什么是版本控制系统? 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版 本修订情况的系统.版本控制系统不仅可以应用 ...
- 使用 Jenkins 搭建 iOS/Android 持续集成打包平台【转】
背景描述 根据项目需求,现要在团队内部搭建一个统一的打包平台,实现对iOS和Android项目的打包.而且为了方便团队内部的测试包分发,希望在打包完成后能生成一个二维码,体验用户(产品.运营.测试等人 ...
- CI Weekly #16 | 从另一个角度看开发效率:flow.ci 数据统计功能上线
很开心的告诉大家,flow.ci 数据统计功能已正式上线. 进入 flow.ci 控制台,点击「数据分析」按钮,你可以按照时间日期筛选,flow.ci 将多维度地展示「组织与项目」的构建数据指标与模型 ...
- Git 深入浅出
如果你是一个开发人员,想用上这个世界上目前最先进的分布式版本控制系统,那么,赶快开始学习吧!(耐心读下去,收获满满) Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git ...
随机推荐
- 适合 JS 新手学习的开源项目——在 GitHub 学编程
作者:HelloGitHub-小鱼干 这里是 HelloGitHub 的<GitHub 上适合新手的开源项目>系列的最后一篇,系列文章: C++ 篇 Python 篇 Go 篇 Java ...
- 测试开发工程必备技能之一:Mock的使用
1. 背景 在实际产品开发过程中,某个服务或前端依赖一个服务接口,该接口可能依赖多个底层服务或模块,或第三方接口,比如说服务 A 依赖服务B,服务B又依赖服务 C,如下图所示: 这种依赖的问题会导致原 ...
- moviepy音视频剪辑:多个视频合成一个视频
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.视频合成概述 视频合成,也称为非线性编辑,实际 ...
- C#声明一个100大小的数组 随机生成1-100之间不重复的数
面试题:C#声明一个100大小的数组 随机生成1-100之间不重复的数下面是C#的实现方式,编译测试通过 public static void InsertRandomArray() { int[] ...
- 中间件面试专题:RabbitMQ高频面试问题
- CSS基础-层叠与继承
继承 一些属性可以被继承,一些不可以. 一般来说,字体颜色.字体大小会被继承,关于形状的如 padding .border .margin.width等就不会被继承.哪些属性属于默认继承很大程度上是由 ...
- datagrip2020最新安装破解教程方法激活码安装参数
现在,datagrip的版本已更新至2020.3,尚未升级的用户请赶快升级. 本文教您如何安装datagrip2020.3版本并破解它. 此方法可以100%永久激活datagrip2020.3(低版本 ...
- AcWing 334. K匿名序列
大型补档计划 题目链接 就是把序列分成无数段,每段长度 $ >= K$,然后 \([l, r]\) 这段的花费是 \(S[r] - S[l - 1] - (r - l + 1) * a[l]\) ...
- 题解-[SDOI2016]征途
[SDOI2016]征途 [SDOI2016]征途 给定长度为 \(n\) 的序列 \(a\{n\}\),将其分为连续 \(m\) 段,和分别为 \(v\{m\}\).\(v\{m\}\) 的方差为 ...
- 笔记-AHOI2013 差异
AHOI2013 差异 方法1:SA 先板个后缀数组(带 \(height\) 不带 \(st\) 表),用单调队列递推每个后缀 \(sa_i\) 对答案的贡献,求和,用定值减之. #include ...