书接上回,上回讲到要想学习Git,需要先忘记SVN。
Git的文件存储是不同于一般的版本控制工具,Git每次存储的是全部文件的快照,而不是只存储修改文件的diff。
但是在我们修改,提交文件的时候,Git文件是经过怎样的变化才存储到版本库中呢?
众所周知:人的一生经过出生成长,衰老,最后到死亡,这是每个人都避免不了的。但是文件快照中记录的文件在Git仓库中是怎样走过他们一生的呢?他们也会按照我们的规律发展吗?
今天就来介绍Git的文件状态变化。
Git有三种文件状态:
已提交(unmodified),已修改(modified),已暂存(staged)
,
当然,未跟踪(untracked)的文件应该还不属于Git文件。
Git文件状态转换关系
上面记录了Git的三种文件状态之间的转换: 已提交的文件在本地 工作区修改之后状态变成 已修改,把 已修改的文件加入到 暂存区后,状态变为 已暂存,把 已暂存的文件提交到 Git仓库后,状态又重新变为 已提交。
由此引入了Git三个区域的概念:
工作区(Working Directory),暂存区(Staging Area),Git仓库(.git directory)。
Git结构
我们从Gitlab上clone了一份代码之后,我们自己的Git仓库就诞生了。
我们在进入到clone的文件夹后看到的除了.git之外的,即为
工作区(Working Directory),此时所有的文件均为
已提交(unmodified)状态。
这时我们发现有个文件怎么编译都不过,我们需要对其进行修改,修改之后,当前的文件修改仅仅只在
工作区(Working Directory)做了修改,并没有把该文件添加到暂存区。这时文件状态变为
已修改(modified)。
我们执行
git add操作后,即把该文件添加到了
暂存区(Staging Area)。文件的状态就变化为了
已暂存(staged),这时我们就可以进行commit操作了,当然也可以等到其他文件也暂存之后,一起提交。
(什么是暂存区,怎么添加到暂存区的?我们下节重点介绍。现在先想象成一个区域吧!)
在执行
git commit命令后,文件就添加到
Git仓库(.git directory)了,文件的状态又变回了
已提交(unmodified)。
这样这个文件就完成了一次在Git中
出生(clone)--- 叛逆(被修改)--- 成长(被暂存)--- 死亡(合入到Git仓库)的过程。
那么有人就要问了:
只是执行了一条add语句,就把文件加入到了暂存区,到底是怎么加入的?
为什么要有暂存区的概念,直接修改提交不是更简单吗?
Git暂存区真的不需要吗?Git暂存区的优势在哪里?Git暂存区将何去何从?
请听下回:
Git背后的故事-暂存区+对象文件
想知道关于Git更多内容,请继续关注:
一起学Git