# 底层命令和高层命令

本书旨在讨论如何通过 checkoutbranchremote 等大约 30 个诸如此类动词形式的命令来玩转 Git。 然而,由于 Git 最初是一套面向版本控制系统的工具集,而不是一个完整的、用户友好的版本控制系统,所以它 还包含了一部分用于完成底层工作的命令。 这些命令被设计成能以 UNIX 命令行的风格连接在一起,抑或藉由脚本调用,来完成工作。 这部分命令一般被称作 底层(plumbing)命令,而那些更友好的命令则被称作 高层(porcelain) 命令

本书前九章专注于探讨高层命令。 然而在本章,我们将主要面对底层命令。 因为,底层命令得以让你窥探 Git 内部的工作机制,也有助于说明 Git 是如何完成工作的,以及它为何如此运作。 多数底层命令并不面向最终用户:它们更适合作为新命令和自定义脚本的组成部分。

当在一个新目录或已有目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含了几乎所有 Git 存储和操作的对象。 如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。 本章探讨的所有内容,均位于这个目录内。 该目录的结构如下所示:

$ ls -F1
HEAD
config*
description
hooks/
info/
objects/
refs/
1
2
3
4
5
6
7
8

该目录下可能还会包含其他文件,不过对于一个全新的 git init 版本库,这将是你看到的默认结构。

  • description 文件:仅供 GitWeb 程序使用,我们无需关心。
  • config 文件包:含项目特有的配置选项。
  • info 目录:包含一个全局性排除(global exclude)文件,用以放置那些不希望被记录在 .gitignore 文件中的忽略模式(ignored patterns)。
  • hooks 目录:包含客户端或服务端的钩子脚本(hook scripts),在 Git 钩子 中这部分话题已被详细探讨过。

剩下的四个条目很重要:这些条目是 Git 的核心组成部分

  • HEAD 文件:指示目前被检出的分支
  • (尚待创建的)index 文件:保存暂存区信息
  • objects 目录:存储所有数据内容
  • refs 目录:存储指向数据(分支)的提交对象的指针;

我们将详细地逐一检视这四部分,以期理解 Git 是如何运转的。