likes
comments
collection
share

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

作者站长头像
站长
· 阅读数 29

一、 Git现状

Git 是一款分布式版本控制工具。它主要用于代码的版本管理和协作开发。

通俗点说Git是一个文件存储工具,一个版本管理工具,一个协作开发的工具。

其中Git所具有的版本管理能力,在很多人眼里就如同魔法般的存在,各种分支创建与跳转,各种历史版本的切换,无论是开发过程中,还是代码追溯中,总能利用Git找到想要的版本代码。

因为功能的强大,必然造成概念略多,学习成本也相对来说有点高。

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

面对复杂的Git命令,有的人退而求其次,只把Git当成"代码网盘",开发中只用来保存代码,其他的功能一概不用。面对无法驾驭的Git,生怕一个手指敲下去,代码搞乱了。我就碰上过这样的程序员,版本管理靠手工创建版本号的文件夹,代码比对用compare工具。纯手工项目管理。还好代码并不太多,是硬件工程师。不然就光重复的cp代码,会很快把硬盘填满的。

依靠IDE强大的Git插件,各种分支管理,各种版本回退,各种代码比对,点点鼠标,UI就把结果展示出来。以至于很多人懒得深究底层原理。至今都对Git中的一些概念理解错误。

二、 "变动"是比对计算出来的,而不是保存的。

Git有三个区,分别是工作区,暂存区,历史区。

工作区的代码通过git add命令,将代码提交到暂存区,通过git commit将代码提交到历史区。那么问题来了,每次提交到底提交的是变动的代码?还是整个完整的代码?

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

很多人,包括很多git教程,都从第一意识出发,认为提交的是变动的代码。但实际上,提交的是完整的"文件快照"。

我们从一个简单的demo文件出发。

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

文件中只有 A B C三行字符串,当前状态是,A已经提交到历史区,B已经提交到暂存区,还未提交到历史区,C是工作区新增加的代码,并未提交到暂存区。

使用git status查看当前状态。

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

git status中提示暂存区有改动并未提交(B在暂存区并未提交),同时提示工作区有改动并未提交(工作区的C并未提交)。提示中的“changes”改动,描述并没有错误,但是要理解成纯粹的变动,就会导致理解错误。

脑海中第一映像如下图。每个区存储的都是最新的变动

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

但其实这是错误的,真正的理解图应该如下:

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

工作区,暂存区,历史区,存储的是完��文件的快照。变动是比对快照计算出来的。

至于前文章提到的"changes"都是通过比对不同区的文件,而最终得出的"changes"。

比如工作区当前的变动文件,是通过比对工作区和暂存区的文件,发现"C"新添加的。

git diff 查看工作区变动

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

比对历史区和暂存区文件,会发现"B"是暂存区新添加的。

git diff 查看缓存区变动

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

比对历史区和暂存文件,则会发现 "BC"是那个"changes"

git diff commit-id 比对工作区与历史版本

GIT中易错概念理解:changes是比对计算出的,不是存储得出的

三、 结论

在git的官网文档中,有这么一段描述。

Git 更像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流

如果没有前文的说明,第一次看这定义,大概率会蒙圈的。这句话可以有以下理解。

  1. git中的三个区都存储的是文件快照,而不是变动快照,每个文件都会有一个快照。
  2. 工作区和缓存区每次文件更新后都会生成新的快照替换旧的快照,每个文件都只有唯一一个快照。
  3. 历史区存储的也是每个文件的快照,同个文件,会按照版本的不同存储多个快照。

总之一句话:

"changes是计算得出的,不是存储得出的。"


如果本文对你有所帮助,请关注公众号:程序人生golang起来

人生苦短,我用golang,速享Go语言盛宴,技能升级不停歇!聚焦Golang技术分享,洞察程序员多彩生活,速递行业资讯。加速前行在Go的旅途中!

转载自:https://juejin.cn/post/7399530622207574031
评论
请登录