我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:神州彩票 > 二进制字符 >

20 分钟教你搞懂 Git!

归档日期:05-06       文本归类:二进制字符      文章编辑:爱尚语录

  Git 是最流行的版本管理工具,也是程序员必备的技能之一。本文就来教你 20 分钟搞懂 Git!

  尽管每天你都会用到Git,但也有可能搞不懂它的工作原理。为什么Git可以管理版本?基本命令git add和git commit到底在干什么?

  在这篇文章中,我将用一个例子来解释Git的运行过程,帮助你理解Git的工作原理。

  如果想管理项目的版本,那么我们应该做的第一件事情就是通过git init初始化。

  git init只做了一件事情,那就是在项目的根目录下创建.git子目录来保存版本信息。

  然后把这个文件添加到Git代码库中,这一步将创建test.txt现有内容的一个副本。

  在上述代码中,git hash-object命令将test.txt现有的内容压缩成二进制文件,并保存到Git中。该压缩文件叫做Git对象,保存在.git/objects目录中。

  我们可以通过这个命令根据对象的文件名获取当前内容,并计算成SHA1 哈希(长度为40的字符串)。让我们看看下列新生成的Git对象文件。

  如上述代码所示,.git/objects目录下又多出了一个子目录,而且这个子目录名是上述哈希值的前两个字符。在这个子目录下有一个文件,文件名是上述哈希值中其余的38个字符。

  上述代码输出的文件内容是一些二进制字符。你可能会问既然test.txt是空文件,又怎么会有这些内容呢?这是因为该二进制对象中还存储了一些元数据。

  如果你想看看该文件原始的文本内容,那么应该使用git cat-file。

  因为原文件为空,所以上述命令什么都没有显示。现在我们往test.txt文件中写点东西。

  当文件保存成二进制对象以后,你需要告诉Git哪个文件发生了变化。Git会在一个名叫“索引”(或阶段)的区域记录所有发生了变化的文件。然后等到所有的变更都结束后,将索引中的这些文件一起写入正式的版本历史记录中。

  上述命令记录了文件名test.txt、二进制对象名(哈希值)以及索引中文件的访问权限。

  上述代码显示索引中只有一个test.txt文件,还显示了该文件的二进制对象名和访问该文件的权限。如果你知道该二进制对象名,就可以查看.git/objects子目录中该文件的内容。

  上述代码显示索引中只有一个新文件test.txt,该文件正在等候写入版本的历史记录中。

  针对每个文件执行上述两个步骤非常繁琐。所以Git提供了git add命令来简化这些操作。

  索引保存发生了变化的文件信息。等到修改完成,所有这些信息都会被写入版本的历史记录中,这相当于生成一个当前项目的快照。

  项目的历史记录由不同时间点的项目快照组成。Git可以将项目恢复成任何一个快照。在Git中“快照”有一个专门的术语,即“提交”(commit)。所以生成快照也可以称之为完成提交。

  首先,我们需要设置用户名和邮件地址。在你保存快照的时候,Git需要记录是谁执行的提交。

  接下来,保存现有的目录结构。在本文的前面我们讨论了保存对象只会保存一个文件,并不会记录文件之间的目录结构。

  git write-tree命令可以根据当前目录结构生成一个Git对象。

  在上述代码中,目录结构保存成了二进制对象,而对象的名字是哈希值。它也保存在.git/objects目录中。

  这个所谓的快照就是保存当前的目录结构,以及每个文件相对应的二进制对象。之前的操作已经保存了文件结构,所以现在你需要把这个目录结构和一些元数据一起写入版本的历史记录中。

  在上述代码中,在提交时你需要提供提交的描述,而且你可以通过echo first commit提供提交描述。git commit-tree命令会根据元数据以及目录树生成一个Git对象。现在,让我们来看看该对象的内容。

  在上述代码中,第一行输出是对应于该快照的目录树对象,而第二行和第三行是有关作者和提交者的信息,最后一行内容是提交的描述。

  Git提供了git commit来简化上述提交操作。在保存到索引后,你只需要执行git commit命令,就可以同时提交目录结构和描述,并生成快照。

  然而,如果你使用git log命令来查看整个版本的历史记录时,却无法看到刚刚生成的快照。

  真相是:git log命令只可以显示当前分支上的变化。尽管我们已经提交了这个快照,但是还没有记录这个快照属于哪个分支。

  分支是快照的指针,分支的名字就是该指针的名字。虽然哈希值不可读,但是分支允许用户给快照起别名。另外,分支还会自动更新,如果当前分支是一个新的快照,那么这个指针会自动指向它。例如,主分支(master branch)有一个名为master的指针指向主分支当前的快照。

  用户可以为任何快照创建新指针。例如,如果你想创建一个新的fix-typo分支,那么只需创建一个名为fix-typo的指针,并指向一个快照。因此,在Git中创建一个新分支非常容易,而且开销非常低。

  Git有一个特殊的指针HEAD,它始终指向当前分支中最新的那个快照。另外,Git还提供了快捷方式。例如,HEAD^指向HEAD之前的快照(父节点),而HEAD~6指向HEAD之前的第六个快照。

  每个分支的指针都是一个文本文件,存储在.git/refs/heads/目录中。文件的内容是它指向的快照的二进制文件名(哈希值)。

  在上述代码中,我们可以通过git commit-tree命令的参数-p来指定父节点,即以哪个快照为基础。

本文链接:http://runhappyplace.com/erjinzhizifu/181.html