MENU

Git原理

August 25, 2021 • Read: 121 • 常山阅读设置

Git原理

前些天看到一个利用Git文件泄露反制攻击者的文章,发现现在还不了解Git的原理,李泽帆老师的文章给我了太多帮助,非常感谢前辈的文章。

What is Git?

我相信大部分计算机专业的人的都知道Git,不就是个版本控制的软件嘛。使用了Git以后,所有对文档的操作都会被记录、追踪,并且会保存在.git这个目录里。

How does Git work?

首先来明确每个Git项目的根目录下的几个概念:

  1. 工作区:代码所在的目录
  2. 索引:/git/index文件
  3. 本地仓库:.git目录

每当修改工作区中的文件(所有的增删改操作),都只是正常的修改。每当将修改后的文件提交(commit)到.git目录后,Git才会进行版本管理,每次commit后会重建索引,将新的索引指向commit后的文件。

Example

我来举个例子,就很好懂git的原理了

  1. 首先我们在git_test文件夹中创建两个新文件,添加到git中
  2. 使用tree -a查看目录结构,发现将git_test添加到Git后,根目录下多出了.git文件夹,在.git/objects目录中有两个198b的目录,每个目录下都有一串字符命名的文件,这些字符串都是根据SHA1算法生成的,其中前两位作为目录名,后面的38位作为文件名
  3. 我们可以使用git cat-file -t 190a18(190a18来源于2位目录名和4位文件名)查看该文件的类型,使用git cat-file -p 190a18查看该文件的内容,第一个命令发现190a18是一个blob节点,第二个命令查看到了190a18中储存的内容,在Git中,blob类型只储存文件内容,不包括文件名、权限信息等
  4. 使用git commit -m '1st'将我们的a.txtb.txt提交到Git中
  5. 接着我们继续使用tree命令,发现.git/objects目录新增了两个目录
  6. 使用git cat-file命令查看类型和内容,发现这个类型是tree,内容包含权限信息(100644)、文件类型(blob)、对应的SHA1值(190a18)、文件名(a.txt)
  7. 查看另一个多出来的目录,发现这个类型是commit,内容包含tree节点的SHA1信息、作者姓名、邮箱、UNIX时间戳、提交时填写的信息
  8. 这时候我们用命令cat .git/HEAD查看这个Git的分支信息,可以看到.git/HEAD文件中储存了当前的分支master,然后我们用命令cat .git/refs/heads/master可以查看该分支对应的信息,然后通过分支的SHA1查看相应文件内容
  9. 现在我们新建一个c.txt文件,将这个文件添加到Git中
  10. 重新进行一下步骤8里的操作,发现master分支更新了SHA1的值,现在指向一个新的SHA1,之前的SHA1变成了parent
  11. 查看新的tree,发现已经将c.txt添加到了Git中
  12. 接下来,用命令git branch创建一个分支
  13. 切换到这个分支后,创建一个新文件并提交
  14. 然后访问查看.git/HEAD文件,发现现在分支已经指向了test
  15. 根据SHA1的值,我们重新读取Git信息,发现已经提交成功到新的分支
  16. 现在切换回master分支,发现新建的d.txt文件已经消失了
  17. 使用git log查看不同分支的提交历史,可通过历史看到每次提交的commitSHA1的值

Summary

经过对Git原理的简单分析,我基本上明白了Git的工作流程。Git就像一个有向无环图,修改分支就像嫁接,修改内容就像结果,总体来说Git的工作流程和原理的条理是非常的清晰,只要动手真正的操作一下git命令,很快就会明白其原理和流程。

Some URL

http://onlywei.github.io/explain-git-with-d3

Archives QR Code Tip
QR Code for this page
Tipping QR Code