一、工作区、暂存区、版本库
- 工作区:写代码或文件的目录。
- 暂存区:英文名stage或index。一般存放在.git目录下的index文件(.git/index)中,我们把暂存区有时也叫做索引(index)。(这里如果没有进行commit那么是找不到index目录的)下面会有讲解。
- 版本库:又名仓库,英文名repository。工作区有一个隐藏目录.git,它不算⼯作区,⽽是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原/回滚”。
下⾯这个图展⽰了⼯作区、暂存区和版本库之间的关系:
- 图中左侧为⼯作区,右侧为版本库。Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。
- 在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指针叫HEAD。(分支和HEAD的概念后面再说)
- 当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区(stage)⽬录树的⽂件索引会被更新。
- 当执行提交操作git commit时,master分支会做相应的更新,可以简单理解为暂存区的目录树才会真正写到版本库中。
- 由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使用git add和git commit命令才能将文件添加到仓库中进行管理。
- 那么回答暂存区的疑问,为什么初始化后没有index
- 创建个文件是没有index/stage
- add后就出现了
二、添加一个test文件(包含查看提交记录指令)
在包含.git 的目录下新建一个test文件,我们可以使⽤ git add 命令可以将文件添加到暂存区:
- 添加⼀个或多个⽂件到暂存区: git add [file1.c] [file2.c]....
- 添加指定目录到暂存区,包括子目录:git add[dir]
- 添加当前目录下的所有文件到暂存区:git add
再使用git commit命令将暂存区内容添加到本地仓库中:
提交暂存区全部内容到本地仓库中:git commit -m "message"
提交暂存区的指定⽂件到仓库区: git commit [file1] [file2] ... -m "message"
注意 git commit 后⾯的 -m 选项,要跟上描述本次提交的message,由⽤⼾⾃⼰完成,这部分内
容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。(相当于对本次提交内容的阐述)
我们还可以分别add不同的文件,而只commit一次便可以提交所有文件,是因为需要提交的文件都被add到暂存区了,commit就全提交了。
截⾄⽬前为⽌,我们已经能够将代码直接提交⾄本地仓库了。我们可以使⽤
git log
命令,查看历史提交记录。该命令显⽰从最近到最远的提交⽇志,并且可以看到我们commit时的⽇志消息。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数
需要说明的是,我们看到的一大串类似b989c...54a0的是每次提交的版本号,Git的commit id不是1,2,3...递增的数字,而是一个SHA1(SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS))计算出来的一个非常大的数字,用十六进制表示。
三、查看.git文件
前面研究stage的时候看了.git的目录结构,这里便不再重复查阅。
可以知道的是
- index就是暂存区,add后的内容就是添加到了这里面。
- HEAD就是默认指向master分支的指针:
而默认的master分支,其实就是:
可以发现打印的那串数字就是版本号(commit id)
- objects 为Git的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏git add 命令时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的一个新的对象中,就位于“.git/objects”目录下
查找object时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。
找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过sha (安全哈希算法)加密过的文件,好在可以使用git cat-file命令来查看版本库对象的内容:
这就是最近一次提交
其中,还有一行tree 838c778444d1f3e9d731f65854ea05e2a7f3a889看看它的结果
再看看test对应的版本号
这就是对test做的修改被记录下来了。
总结
在本地的git仓库中,有⼏个⽂件或者⽬录很特殊
• index:暂存区, git add 后会更新该内容。
• HEAD:默认指向master分⽀的⼀个指针。
• refs/heads/master:⽂件⾥保存当前master分⽀的最新 commit id 。
• objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了git维护的所有修改。
版权归原作者 KrisZhang10 所有, 如有侵权,请联系我们删除。