Git原理
前些天看到一个利用Git文件泄露反制攻击者的文章,发现现在还不了解Git的原理,李泽帆老师的文章给我了太多帮助,非常感谢前辈的文章。
What is Git?
我相信大部分计算机专业的人的都知道Git
,不就是个版本控制的软件嘛。使用了Git
以后,所有对文档的操作都会被记录、追踪,并且会保存在.git
这个目录里。
How does Git work?
首先来明确每个Git项目的根目录下的几个概念:
- 工作区:代码所在的目录
- 索引:
/git/index
文件 - 本地仓库:
.git
目录
每当修改工作区中的文件(所有的增删改操作),都只是正常的修改。每当将修改后的文件提交(commit
)到.git
目录后,Git才会进行版本管理,每次commit
后会重建索引,将新的索引指向commit
后的文件。
Example
我来举个例子,就很好懂git
的原理了
- 首先我们在
git_test
文件夹中创建两个新文件,添加到git中 - 使用
tree -a
查看目录结构,发现将git_test
添加到Git后,根目录下多出了.git
文件夹,在.git/objects
目录中有两个19
和8b
的目录,每个目录下都有一串字符命名的文件,这些字符串都是根据SHA1算法生成的,其中前两位作为目录名,后面的38位作为文件名 - 我们可以使用
git cat-file -t 190a18
(190a18来源于2位目录名和4位文件名)查看该文件的类型,使用git cat-file -p 190a18
查看该文件的内容,第一个命令发现190a18
是一个blob
节点,第二个命令查看到了190a18
中储存的内容,在Git
中,blob
类型只储存文件内容,不包括文件名、权限信息等 - 使用
git commit -m '1st'
将我们的a.txt
和b.txt
提交到Git中 - 接着我们继续使用
tree
命令,发现.git/objects
目录新增了两个目录 - 使用
git cat-file
命令查看类型和内容,发现这个类型是tree
,内容包含权限信息(100644
)、文件类型(blob
)、对应的SHA1值(190a18
)、文件名(a.txt
) - 查看另一个多出来的目录,发现这个类型是
commit
,内容包含tree
节点的SHA1信息、作者姓名、邮箱、UNIX时间戳、提交时填写的信息 - 这时候我们用命令
cat .git/HEAD
查看这个Git的分支信息,可以看到.git/HEAD
文件中储存了当前的分支master
,然后我们用命令cat .git/refs/heads/master
可以查看该分支对应的信息,然后通过分支的SHA1查看相应文件内容 - 现在我们新建一个
c.txt
文件,将这个文件添加到Git中 - 重新进行一下步骤8里的操作,发现
master
分支更新了SHA1的值,现在指向一个新的SHA1,之前的SHA1变成了parent
- 查看新的
tree
,发现已经将c.txt
添加到了Git中 - 接下来,用命令
git branch
创建一个分支 - 切换到这个分支后,创建一个新文件并提交
- 然后访问查看
.git/HEAD
文件,发现现在分支已经指向了test
- 根据SHA1的值,我们重新读取Git信息,发现已经提交成功到新的分支
- 现在切换回
master
分支,发现新建的d.txt
文件已经消失了 - 使用
git log
查看不同分支的提交历史,可通过历史看到每次提交的commit
SHA1的值
Summary
经过对Git原理的简单分析,我基本上明白了Git的工作流程。Git就像一个有向无环图,修改分支就像嫁接,修改内容就像结果,总体来说Git的工作流程和原理的条理是非常的清晰,只要动手真正的操作一下git
命令,很快就会明白其原理和流程。
Some URL
http://onlywei.github.io/explain-git-with-d3
《Git原理》链接:https://xdym11235.com/archives/72.html
具体版权规定详见侧栏版权说明页面