学习笔记 - 2018年10月第三周 - GIT原理

Git作为目前最流行的版本管理工具,我在工作中已经使用了很长一段时间了,但是每天git add, push, pull的却没有真正花时间去了解一下Git原理,这周的主题我来看看Git的入门原理。

初始化

1
$ git init

如果我们想本地新建一个git项目的话,运行上面命令进行初始化,这个命令背后实际在当前目录下创建一个.git的子目录,用来保存版本信息,进入.git目录看看里面都有哪些东西

粗略看一眼,里面有branch, hooks, logs, HEAD等信息,大概知道它们用来储存什么。

暂存区

所有在git项目内有变动的内容,git都会把它们暂时存在一个地方,叫做“暂存区”,英文index或者stage.

1
$ git update-index --add --cacheinfo 100644 \

上面这个命令用来在index里记录一个变动的文件

1
$ git ls-files --stage

上面这个命令用来显示暂存区里的东西,同时会显示出文件名 + 二进制对象名 + 权限。 知道了二进制对象名,就可以在.git/objects目录里读出这个文件的内容了

git add

如果每次都更新暂存区,那文件一多就太麻烦了,于是git提供了一个简化版的命令

1
$ git add --all

这个命令相当于,对所有当前项目中有改变的文件,保存为object,然后添加到index.

commit

当我们完成一个功能之后,需要把改动的代码一起生成一个快照,写到git历史中。git的历史由不同时间点的快照组成,也就是我们平时在sourceTree中看到的

我们可以把项目恢复到任意一个节点快照。每个节点快照称作一个commit.
快照 = 保存当前的目录结构,以及每个文件对应的二进制对象。

git commit

使用git commit命令,可以同时提交目录结构 + index文件 + 快照说明

1
$ git commit -m "first commit"

git log原理

1
2
3
4
1. 查找head指针对应的分支
2. 找到指针指向的快照
3. 找到父节点,也就是前一个快照
4. 以此类推,显示当前分支的所有快照