文档章节

Git 版本库设计原理

dkvirus
 dkvirus
发布于 2017/07/05 00:07
字数 1913
阅读 154
收藏 1

2.2 版本库的设计原理

上一节介绍了版本库的概念,这一节介绍工作空间与版本库中是如何进行交互的。通过揣摩作者是如何设计 Git 的,来确定我们学习 Git 究竟要学习哪些东东。

1. 将文件添加到版本库

假设你已经按照 2.1 节创建了版本库,管理的目录为 d:\git-demo。

接下来先跟着操作一遍,有疑惑先放着,下面会根据这个例子来介绍具体过程是如何操作的。

  • 在 git-demo 目录下新建文件 readme.txt

    内容如下:(d:\git-demo\readme.txt)

    create a readme.txt file.
    
  • 打开 dos 窗口切换到 git-demo 目录下

    $ cd d:\git-demo
    
  • 输入 git status 查看状态

    状态值:Untracked files,表示这是一个新增的文件。

    status1

  • 将 readme.txt 添加到版本库

    $ git add readme.txt
    
  • 输入 git status 查看状态

    状态值:Changes to be commited,表示版本库已经知道了工作空间被修改了。

    status2

  • 将 readme.txt 提交到版本库

    $ git commit -m "add a readme.txt file"
    
  • 输入 git status 查看状态

    状态值:nothing to commit,表示工作空间的修改已经作为一个版本放到了版本库。

    status3

  • 修改 readme.txt 文件,内容如下:(d:\git-demo\readme.txt)

    create a readme.txt file.
    This is the second revision of the document.
    
  • 输入 git status 查看状态

    状态值:Changes not staged for commit,表示版本库知道文件被修改了,只是还没有提交。

    status4

2. git 设计原理

通过上面的例子,我们有理由推测 git 在添加/修改文件到版本库中是这样操作的:

  • 首先通过 git add 指令将工作区中的内容添加到暂存区;
  • 再通过 git commit 指令将暂存区中内容添加到版本库中。

版本库设计原理图

  • 相关概念说明:
    • 工作区:git-demo 目录(除了 .git 目录以外)可以认为是工作空间
    • 版本库:.git 目录可以认为是版本库,其中版本库中包含两个东东
      • stage:叫做暂存区
      • master:分支,也就是真正意义上存放版本的仓库了

看到上图我们不禁会想:为什么 git 的作者在设计时不直接将工作区中修改的文件直接添加到master版本库中,而要在中间再加一层 stage 暂存区呢?

dk 想了又想,再次做出推测:

抽象成思维导图就是像下面这样的:

git 是如何设计的

这里纠正一个错误,将 master 版本库替换成 master 分支仓库更合适。

寄快递对比图

对比上面两张思维导图,可得出如下结论:

  • 如果小明寄快递到代收点,代收点马上就将快递送到快递公司;小红紧接着又将快递寄到代收点,代收点再次送到快递工资;与代收点在一天内收到小明、小红、小花的快递,在晚上的时候一并将快递送到快递公司。哪种看起来更好不言而喻。

  • 版本库,作为一个仓库保存着不同版本的信息,如果每一次小修改都打一条版本信息放到版本库,那无疑会大大增加版本库的容量。最佳实践时将一定时间内的所有修改作为一条版本放到版本库中最节约资源。

  • 如果小明寄快递到代收点,后来发现东西记错了,想要取回来,直接去代收点拿回来就可以了。如果没有代收点,小明的快递直接寄到快递公司,被快递公司放到了大货车上就不是那么容易拿回来了。放到版本库中的暂存区也就是方便你撤销你的修改。

现在再回过头来看看 1 中示例代码,是不是对整个流程知根知底了,对工作区,暂存区和版本库的概念也大致熟悉了。如果不熟悉,请将本节重新阅读一遍。

3. 暂存区管理的是修改,不是文件

老的版本控制系统比如 svn,管理的是文件,也就是你每一次将本地代码提交到仓库时,实际上提交的都是文件,而文件如果一多,就会导致同步速度很慢。(使用过 svn 的应该有感受)

Git 的作者考虑到这一点,舍弃了管理文件的思想,使用管理修改的新新思想,这也就是为什么使用 Git 速度很快的原因。

举例说明:

  • 在 git-demo 目录下新建 test.txt 文件

    内容如下:(d:\git-demo\test.txt)

    this is a test.txt file.
    
  • 将 test.txt 文件添加到暂存区

    $ git add test.txt
    
  • 修改 test.txt 文件

    内容如下:

    this is a test.txt file.
    This is the second revision of the document.
    
  • 将 test.txt 文件提交到分支仓库

    $ git commit -m "add test.txt"
    
  • 使用 git status 查看状态

    $ git status
    

    管理的是修改

我们明明 commit 了 test.txt 文件,为什么还显示有东西要提交呢?

我们来分析一下这个过程:

管理的是修改

  • 在示例代码中,第一次新增 test.txt 文件后使用 git add 把它放到了暂存区中;

  • 第二次修改 test.txt 文件后并没有添加暂存区而直接使用 git commit 操作将暂存区中内容提交到分支仓库中。

  • 因此,使用 git status 时可以看到仍然有一个修改,提示值:"Changes not staged for commit"也可以看出有个修改没有放到暂存区中,stated 就是暂存区的意思。

  • 如果管理的是文件,在使用 git commit 时应该就将 test.txt 文件直接添加到版本库中。使用管理修改而不管理文件的目的是让这个过程变得更快,因为修改可以是一段描述性的字符串即可。

4. Git 我们主要学些什么

经过上面的学习,我们知道使用版本控制就是将本地工作区的代码在分支仓库中进行备份,而我们关心的操作就是如何从本地到暂存区到分支仓库这一条流水线的正常工作。

git 要学什么

本节我们已经学习过在这条流水线上新增操作了,在接下来的章节将学习撤销操作与删除操作。

当然,上述三种操作可以看成是将文件塞到分支仓库,那么从分支仓库中将备份取出来也至关重要,因此,我们还要学习如何回滚版本库中指定备份。

5. 总结

  • 本节介绍了 Git 的设计原理

    主要要掌握工作区、暂存区与分支版本库的概念。

  • 根据设计原理确定接下来的学习路线

    • 将本地代码备份到分支仓库流水线:工作区 - 暂存区 - 分支仓库;

    • 已经介绍过新增操作,通过 git add 添加到暂存区,通过 git commit 提交到分支仓库;

    • 接下来学习撤销操作和删除操作。

  • 介绍了暂存区时管理修改而不是管理文件

    这一点没看懂的拉上去再看一遍

  • 学习到了三个指令

    • git add <filename>

      提交工作区中文件到暂存区

    • git commit -m <descrption>

      将暂存区中所有修改提交到分支仓库中;

      -m 后面紧跟着的是对当前版本的一段描述话语,方便以后再分支仓库中快速找到某个版本;

      注意:这里要用双引号,不能用单引号。

    • git status

      查看文件/目录在 git-demo 目录下的状态,好比收快递时查的物流信息一样。

      文件在版本库中的位置

© 著作权归作者所有

上一篇: Git 版本回滚
下一篇: Git 版本库理解
dkvirus
粉丝 41
博文 120
码字总数 117311
作品 0
六安
程序员
私信 提问
Git 入门教程

原文来自:https://my.oschina.net/dkvirus/blog/1154601 写作本篇的目的: 最初我是要找 Github 相关教程的,查阅了很多资料才发现 Git 才是核心。 网络上的资料大多只讲解 Git 的某个知识点...

嘘别吵_4d1c
2017/12/08
0
0
Git & CocoaPods & 私有化,你不得不知的组件化基础!

Git 理解Git的设计思想和基本的工作原理,对更好的使用Git至关重要。 Git思想 直接记录快照,而非比较差异。和其他版本控制系统不同的是,Git存储数据时将数据看成小型的文件系统的一组快照,...

Owenli_千
2018/01/04
0
0
Git版本控制系统简介(itercast学习笔记)

Git是一个分布式版本控制系统 Git最初开发是为了取代BitKeeper,由Linux创始人Linus Torvalds开发,作为Linux内核代码管理系统使用 Git设计时考虑了很多方面,除了分布式版本控制系统的优点外...

VincentJiang
2013/08/12
0
0
Subversion 客户端SVN协议接入Git Repository 与git-as-svn

本人司职GIT的Subversion Client的接入实现。 Subversion 客户端访问远程库主要是HTTP(s) SVN(+SSH)协议。目前Nginxvcs主要是实现HTTP层面的协议。Nginxvcs实现Subversion 客户端接入的原理如...

Force武装卫队
2014/12/11
58
1
5分钟精通git

git是一个版本控制工具,就要先弄清楚什么是版本 版本: 对外发布的版本如v1.0.0,v1.1.0 叫version 内部代码的版本叫commit,如:修改了一个错别字 顾名思义一个version就是很多个commit的集...

苗威
2015/12/27
211
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
解决多线程并行加载缓存问题(利用guava实现)

依赖 com.google.guava:guava:20.0 import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import j......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部