![图片已移除]
问题引入
若在 code 目录下执行 git init 初始化仓库后,并在该目录下创建 ReadMe 文件,此时 git 能否管理该文件呢?
答案是不行的。ReadMe 所在目录并不是 git 仓库,git 仓库(也称为版本库)在 .git 隐藏目录中。
那我们可不可以将 ReadMe 移动到 .git 目录中呢?当然是不可以的。
注意:我们不允许在
.git下手动修改,若误改误删.git目录下的文件,则可能导致 git 无法正常工作、无法实现版本管理。
ps:上述 ReadMe 文件位于 .git 同级目录下,该区域称为工作区。.git 目录不属于工作区内容。
认识工作区与版本库
git 在管理过程中划分了 2 个区域,及一个用于记录每次修改内容的对象库,下方为 2 个区域的概述:
工作区:创建 git 仓库的目录,即程序员编写某个项目的目录;
版本库:版本库进一步划分了 3 个主要功能区域:暂存区、对象库及 HEAD 指针,HEAD 可以指向不同的分支。
暂存区(索引):顾名思义,就是暂时存放修改的区域,其英文名称为 stage 或 index,一般存放在 .git/index 中;(其内容存放的是对象库对象的索引)
对象库:用户对版本库进行的每次修改(修改的工作区内容),都会被记录到对象库中的一个新的 git 对象中;
HEAD:HEAD 指向当前正在操作的分支,分支中呈现出树状结构,它们的前后关系与修改的提交顺序有关,每个节点指向版本库下对象库中的一个对象,对象中记录具体的修改内容,而分支记录的是各个对象的前后关系。(简而言之,分支存储修改的前后关系,不存放具体的修改)
由上述描述可知,新建一个文件,并不能称为向仓库中新增文件,而只是在工作区新增了文件,必须通过使用 git add 和 git commit 命令才能将文件添加到仓库中,添加后 git 才能进行管理。
git add 后,将会在版本库的对象库中创建新的对象,保存新的修改内容;并在暂存区/索引中建立与修改对象的联系。
git commit 后,会将暂存区中的索引信息更新到指定分支上,此时才真正实现版本管理。
下面 tree .git 查看目录结构,其中,HEAD 对应于 head 指针,object 目录为对象库,由于当前没有执行任何 add 操作,因而暂存区不存在,若执行 add 后,将新增 index 文件夹,其用于保存暂存区内容。
添加文件
若需要将文件添加到暂存区中,则可以使用
git add [file1][file2][...]
上方命令需要依次列举各个文件,若要将所有文件都添加到暂存区,则可以执行
git add .
添加到暂存区后,若要将文件提交到 HEAD 指针所指向的分支上,则需要执行
git commit -m "此处填写本次提交的备注信息"
从上图可知,在 git commit 后,git 会记录当前文件数目的变化,记录新增或减少几行,并记录对应的备注信息。
下方创建 3 个文件后,分两步将工作区文件添加到暂存区,再使用 commit 将修改同步到 HEAD 所指向的分支。
若需要查看历史提交,可以使用 git log,其将按时间从近到远打印历史提交信息。可以使用 git log --pretty=oneline 简化提交信息,更加美观。
添加并提交后,.git 目录下发生了变化,变化如下:
此时去查看 HEAD 指针,其内容为 refs/heads/master;若继续查看 中内容,可以发现,其为最新一次提交的 commit id。


