使用 git init
命令在 gitcode
文件夹下创建如下图所示的Git仓库。现在思考这样一个问题:gitcode目录下创建的README文件可以直接被git管理和追踪吗?
答案是否定的,因为只有 Git 本地仓库中的文件才可以被版本控制。什么?难道当前的 gitcode 文件夹不是 Git 的本地仓库吗。为了理解这个问题,我们需要理解 Git 的工作区、暂存区与版本库的区别。
🎯[概念梳理]
- 工作区:即电脑上你要写代码或文件的目录,例如上面的 gitcode 文件夹
- 版本库:又名仓库,英文名 repository 。工作区有⼀个隐藏目录 .git ,它不算工作区,而是Git的版本库。这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"
- 暂存区:英文叫stage或index。⼀般存放在 .git 目录下的index文件(.git/index)中,我们把暂存区有时也叫作索引(index)。
通过上面的梳理,我们明白了,gitcode 本质上是工作区,而 .git 才是真正的版本仓库。我们要想管理我们的代码,就需要将相应的代码添加到版本库中。
新的问题随之而来:我们可以直接将README文件移动到 .git 文件夹中,从而交给git管理吗?这种行为是万万不可取的,.git 文件夹中是不允许进行任何手动修改的,避免git仓库的结构被人为破坏。
为了让README文件被版本库管理,我们需要进行一些额外的操作将工作区中的文件添加到版本库中
- add操作:将工作区的修改(包括新增、删除、修改)内容保存到版本库的暂存区中
- commit操作:将暂存区中的内容添加到master分支下
那么它具体是如何实现的呢?其实在版本库中还有一个对象库 object ,工作区中的 修改内容 (不是对整个文件内容进行拷贝和复制)会以 git对象 的形式写入到对象库中,对git对象的管理就可以实现对文件版本的控制。
- 进行add操作时,会将工作区中的修改内容以git对象 的形式写入到
对象库
中。而暂存区中存放的是对应git对象的 索引,因此暂存区是比较轻量的 - 进行commit操作时,写入master分支的也是对应git对象的索引,因此master分支也是比较轻量的
口说无凭,我们从文件层面上来认识各个分区:
- index :暂存区,
git add
后首先会将 git 对象的索引添加到暂存区中- HEAD :指向当前的工作分支最新提交,默认为 master 分支
- objects :对象库,管理着一个个 git 对象,其存放的形式如下
通过本篇博客的学习,大家已经掌握了Git的基本原理,接下里的博客中将为大家讲解 Git 的各种使用方法