[[r_plumbing_porcelain]]
=== 底层命令和高层命令

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

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

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

[source,console]
----
$ ls -F1
HEAD
config*
description
hooks/
info/
objects/
refs/
----

该目录下可能还会包含其他文件，不过对于一个全新的 `git init` 版本库，这将是你看到的默认结构。
`description` 文件仅供 GitWeb 程序使用，我们无需关心。
`config` 文件包含项目特有的配置选项。
`info` 目录包含一个全局性排除（global exclude）文件(((excludes)))，用以放置那些不希望被记录在 .gitignore 文件中的忽略模式（ignored patterns）。
`hooks` 目录包含客户端或服务端的钩子脚本（hook scripts），在 <<ch08-customizing-git#r_git_hooks>> 中这部分话题已被详细探讨过。

剩下的四个条目很重要：`HEAD` 文件、（尚待创建的）`index` 文件，和 `objects` 目录、`refs` 目录。
这些条目是 Git 的核心组成部分。
`objects` 目录存储所有数据内容；`refs` 目录存储指向数据（分支）的提交对象的指针；`HEAD` 文件指示目前被检出的分支；`index` 文件保存暂存区信息。
我们将详细地逐一检视这四部分，以期理解 Git 是如何运转的。
