本篇文章主要介绍了"欢迎使用CSDN-markdown编辑器",主要涉及到markdown方面的内容,对于系统运维感兴趣的同学可以参考一下:
Translated from http://maryrosecook.com/blog/post/git-from-the-inside-out.本文原地址:...
Translated from http://maryrosecook.com/blog/post/git-from-the-inside-out.
本文原地址:https://github.com/pysnow530/git-from-the-inside-out/blob/master/README.md
彻底理解Git
本文主要解释git的工作原理。如果你是一个视频党,请移步youtube视频。
本文假设你已经了解Git,并可以使用它来对项目做版本控制。我们主要考察支撑Git的图结构和指导Git行为的图属性。在考察原理时,我们会创建真实的状态模型,而不是通过各种实验的结果妄做猜想。通过这个真实的状态模型,我们可以更直观地了解git已经做了什么,正在做什么,以及接下来要做什么。
本文结构组织为一系列的Git命令,针对一个单独的项目展开。在关键的地方,我们会观察Git当前状态的图结构,并解释图属性及其产生的行为。
如果你读完本文后仍意犹未尽,可以看一下maryrosecook对Git的JavaScript实现 ,里面包含了大量注释。
创建项目
~ $ mkdir alpha
~ $ cd alpha
创建项目目录alpha
。
~/alpha $ mkdir data
~/alpha $ printf 'a' > data/letter.txt
进入alpha
目录,创建目录data
。在data
目录下,创建内容为a
的文件letter.txt
。现在,alpha
的目录结构如下:
alpha
└── data
└── letter.txt
初始化仓库
~/alpha $ git init
Initialized empty Git repository
git init
命令将当前目录添加到Git仓库。为此,它会在当前目录下创建一个.git
目录并写入一批文件。这些文件记录了Git配置和版本历史的所有信息。它们都是一些普通的文件,并没什么特别。用户可以使用编辑器或shell命令对它们进行浏览或编辑。也就是说,用户可以像编辑他们的项目文件一样来浏览或编辑项目的版本历史。
现在,alpha
的目录结构变成了这个样子:
alpha
├── data
│ └── letter.txt
└── .git
├── objects
etc...
.git
目录和它的内容是由Git创建的。其它文件组成了工作区,是由用户创建的。
添加文件
~/alpha $ git add data/letter.txt
添加data/letter.txt
文件到Git。该操作有两个影响。
第一,它会在.git/objects/
目录下创建一个新的blob文件。
这个blob文件包含了data/letter.txt
文件压缩后的内容,文件名取自内容的哈希值。哈希意味着执行一段算法,将给定内容转换为更小的1,且能唯一2确定原内容的值的过程。例如,Git对a
作哈希得到2e65efe2a145dda7ee51d1741299f848e5bf752e
。哈希值的头两个字符用作对象数据库的目录名:.git/objects/2e/
,剩下的字符用作blob文件的文件名:.git/objects/2e/65efe2a145dda7ee51d1741299f848e5bf752e
。