Git 版本库设计原理

原文来自:https://my.oschina.net/dkvirus/blog/1155172

2.2 版本库的设计原理

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

1. 将文件添加到版本库

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

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

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

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

create a readme.txtfile.

打开 dos 窗口切换到 git-demo 目录下

$cdd:\git-demo

输入 git status 查看状态

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

将 readme.txt 添加到版本库

$git add readme.txt

输入 git status 查看状态

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

将 readme.txt 提交到版本库

$git commit -m"add a readme.txt file"

输入 git status 查看状态

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

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

createa readme.txt file.Thisisthesecondrevisionofthe document.

输入 git status 查看状态

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

2. git 设计原理

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

首先通过 git add 指令将工作区中的内容添加到暂存区;

再通过 git commit 指令将暂存区中内容添加到版本库中。

相关概念说明:

工作区:git-demo 目录(除了 .git 目录以外)可以认为是工作空间

版本库:.git 目录可以认为是版本库,其中版本库中包含两个东东

stage:叫做暂存区

master:分支,也就是真正意义上存放版本的仓库了

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

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

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

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

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

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

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

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

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

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

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

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

举例说明:

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

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

thisisa test.txt file.

将 test.txt 文件添加到暂存区

$git add test.txt

修改 test.txt 文件

内容如下:

thisisa test.txt file.Thisisthe 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 我们主要学些什么

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

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

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

5. 总结

本节介绍了 Git 的设计原理

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

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

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

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

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

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

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

学习到了三个指令

git add

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

git commit -m

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

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

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

git status

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容