## 7.7 重置揭密
**三棵树**
Git 作为一个系统,是以它的一般操作来管理并操纵这三棵树的:
* HEAD:上一次提交的快照,下一次提交的父节点。
* Index:预期的下一次提交。
* Working Directory:沙盒。
**HEAD**
HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。
可以通过 `cat-file` 来查看快照的信息:
```
$ git cat-file -p HEAD
```
通过 `ls-tree` 来查看快照实际的目录列表,以及其中每个文件的 SHA-1 校验和:
```
$ git ls-tree -r HEAD
```
**索引**
索引是预期的下一次提交,这个概念引用为 Git 的 “暂存区域”。
### 7.7.1 工作流程

**重置的作用**
假设现在有工作历史

在执行了 `git reset` 命令后,移动 HEAD 的指向。 这与改变 HEAD 自身不同(`checkout`所做的),默认情况下是 `--soft` 模式,即不修改索引和工作目录中的内容。

如果使用 `--mixed` 选项,git 会在移动HEAD的指向的同时修改索引中的内容。

如果使用 `--hard` 选项,git 会在移动HEAD的指向的同时修改索引和工作目录中的内容。

**通过路径来重置**
如果在运行 `git reset` 是附加上一个文件的路径:
```
$ git reset [file]
$ git reset --mixed HEAD [file]
```
那么 git 会跳过移动 `HEAD` 的指向,然后让索引中对应的文件看起来像 `HEAD` 的指向中的对应文件。它还有取消暂存文件的实际效果。

如果指定选项 `--hard` ,工作目录中的对应文件也会被一并修改。
**压缩**
如果想要压缩若干次提交,可以使用 `git rest --soft [SHA-1]` 命令先将 `HEAD` 的指向这些需要被压缩的提交的父节点,但不改变索引,然后在这个父提交的基础上新建一次提交,这个提交即为若干个提交的压缩。
### 7.7.2 检出
`checkout` 和 `reset` 的区别在于 `checkout` 只会移动 `HEAD`,而不是 `HEAD` 的指向。而如果为 `checkout` 命令指定一个路径,它的作用就和 `git reset --hard [file]` 命令一样。
- 介绍
- 第一章 起步
- 1.1 关于版本控制
- 1.2 Git 简史
- 1.3 Git 基础
- 1.4 命令行
- 1.5 安装 Git
- 1.6 初次运行 Git 前的配置
- 1.7 获得帮助
- 第二章 基础
- 2.1 获取仓库
- 2.2 记录每次更新到仓库
- 2.3 查看提交历史
- 2.4 撤销操作
- 2.5 远程仓库的使用
- 2.6 打标签
- 2.7 Git 别名
- 第三章 分支
- 3.1 分支简介
- 3.2 分支的新建与合并
- 3.3 分支管理
- 3.4 分支开发工作流
- 3.5 远程分支
- 3.6 变基
- 第四章 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上搭建 Git
- 4.3 生成 SSH 公钥
- 4.4 配置服务器
- 4.5 Git 守护进程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的选择
- 第五章 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一个项目贡献
- 5.3 维护项目
- 第六章 GitHub
- 6.1 账户的创建和配置
- 6.2 对项目做出贡献
- 6.3 维护项目
- 6.4 管理组织
- 6.5 脚本 GitHub
- 第七章 Git 工具
- 7.1 选择修订版本
- 7.2 交互式暂存
- 7.3 储藏与清理
- 7.4 签署工作
- 7.5 搜索
- 7.6 重写历史
- 7.7 重置揭密
- 7.8 高级合并
- 7.9 Rerere
- 7.10 使用Git调试
- 7.11 子模板
- 7.12 打包
- 7.13 替换
- 7.14 凭证存储
- 第八章 自定义 Git
- 8.1 配置 Git
- 8.2 Git 属性
- 8.3 Git 钩子
- 8.4 使用强制策略的一个例子
- 第九章 Git 与其他系统
- 9.1 作为客户端的 Git
- 9.2 迁移到 Git
- 第十章 Git 内部原理
- 10.1 底层命令和高层命令
- 10.2 Git 对象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用规格
- 10.6 传输协议
- 10.7 维护与数据恢复
- 10.8 环境变量
